<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-03-22
* Time: 15:26
*/
namespace App\Controller;
use App\Entity\Location\City;
use App\Entity\Profile\Genders;
use App\Repository\ProfileRepository;
use App\Repository\ServiceRepository;
use App\Service\Features;
use App\Service\ProfileList;
use App\Service\ResponsiveAssetsService;
use Flagception\Bundle\FlagceptionBundle\Annotations\Feature;
use Happyr\DoctrineSpecification\Logic\OrX;
use Porpaginas\Doctrine\ORM\ORMQueryResult;
use Porpaginas\Page;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
#[Cache(maxage: 60, public: true)]
class MasseurListController extends AbstractController
{
use ExtendedPaginationTrait;
use SpecTrait;
const ENTRIES_ON_PAGE = 36;
const RESULT_SOURCE_MASSEURS = 'masseurs';
const RESULT_SOURCE_MASSAGE_SERVICE = 'massage_service';
const RESULT_SOURCE_CITY = 'city';
const RESULT_SOURCE_COUNTRY = 'country';
private ?string $source = null;
public function __construct(
private ProfileRepository $profileRepository,
private ProfileList $profileList,
private Features $features,
private ResponsiveAssetsService $responsiveAssetsService,
private RequestStack $requestStack
) {}
/**
* @Feature("has_masseurs")
*/
#[ParamConverter("city", converter: "city_converter")]
public function page(Request $request, City $city, ServiceRepository $serviceRepository): Response
{
/*
$result = $this->profileList->listActiveWithinCityOrderedByStatusWithSpec($city, new ProfileIsMasseur());
$massageGroupServices = $serviceRepository->findBy(['group' => ServiceGroups::MASSAGE]);
$orX = $this->getORSpecForItemsArray([$massageGroupServices], function($item) {
return new ProfileIsProvidingOneOfServices($item);
});
$result = $this->checkEmptyResultNotMasseur($result, $city, $orX, self::RESULT_SOURCE_MASSAGE_SERVICE);
return $this->render('ProfileList/list.html.twig', [
'profiles' => $result,
'source' => $this->source,
'source_default' => self::RESULT_SOURCE_MASSEURS,
'recommendationSpec' => \App\Specification\ElasticSearch\ProfileIsLocated::withinCity($city),
]);
*/
return $this->forward('App\Controller\ProfileListController::listForMasseur', ['city' => $city]);
}
protected function checkCityAndCountrySource(Page $result, City $city): array|Page {
if(($result && $result->count() != 0) || false == $this->features->fill_empty_profile_list())
return $result;
$this->source = self::RESULT_SOURCE_CITY;
$result = $this->profileList->listRandom($city, null, null, null, true, false, [Genders::FEMALE], true);
if($result->count() == 0) {
$this->source = self::RESULT_SOURCE_COUNTRY;
$result = $this->profileList->listRandom($city, $city->getCountryCode(), null, null, true, false, [Genders::FEMALE], true);
}
return $result;
}
protected function checkEmptyResultNotMasseur(Page $result, City $city, OrX $alternativeSpec, string $source): array|Page {
if($result->count() != 0 || false == $this->features->fill_empty_profile_list())
return $result;
$this->source = $source;
$result = $this->profileList->listRandom($city, null, $alternativeSpec, null, true, false, [Genders::FEMALE], true);
if($result->count() == 0)
$result = $this->checkCityAndCountrySource($result, $city);
return $result;
}
protected function render(string $view, array $parameters = [], Response $response = null): Response
{
if($this->requestStack->getCurrentRequest()->isXmlHttpRequest()) {
$response = parent::render('ProfileList/list.profiles.html.twig', $parameters, $response);
$content = preg_replace('/\s{2,}/', ' ', $response->getContent());
$response->setContent($content);
return $response;
} else {
return parent::render($view, $parameters, $response);
}
}
}