src/Controller/SaloonListController.php line 82

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by simpson <simpsonwork@gmail.com>
  4.  * Date: 2019-04-15
  5.  * Time: 19:51
  6.  */
  7. namespace App\Controller;
  8. use AngelGamez\PorpaginasBundle\Controller\PaginationTrait;
  9. use App\Entity\Location\City;
  10. use App\Repository\DistrictRepository;
  11. use App\Repository\SaloonRepository;
  12. use App\Service\CountryCurrencyResolver;
  13. use App\Service\Features;
  14. use App\Service\ResponsiveAssetsService;
  15. use App\Specification\QueryModifier\FreeProfilesFeatureSaloonOrder;
  16. use App\Specification\Saloon\SaloonIsNotHidden;
  17. use App\Specification\QueryModifier\SaloonOrderedByStatus;
  18. use App\Specification\Saloon\SaloonInMoskowDistricts;
  19. use App\Specification\Saloon\SaloonIsActive;
  20. use App\Specification\Saloon\SaloonIsLocated;
  21. use App\Specification\Saloon\SaloonIsVip;
  22. use Flagception\Bundle\FlagceptionBundle\Annotations\Feature;
  23. use Happyr\DoctrineSpecification\Spec;
  24. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  25. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  26. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\RequestStack;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use OpenApi\Attributes as OA;
  32. class SaloonListController extends AbstractController
  33. {
  34.     use PaginationTrait;
  35.     use ResponseTrait;
  36.     const ENTRIES_ON_PAGE 36;
  37.     private mixed $perPage;
  38.     public function __construct(
  39.         private SaloonRepository $saloonRepository,
  40.         private DistrictRepository $districtRepository,
  41.         private Features $features,
  42.         private RequestStack $requestStack,
  43.         private ResponsiveAssetsService $responsiveAssetsService,
  44.         ParameterBagInterface $parameterBag
  45.     )
  46.     {
  47.         $this->perPage $parameterBag->get('saloon_list.per_page');
  48.     }
  49.     /**
  50.      * @Feature("has_saloons")
  51.      */
  52.     #[ParamConverter('city'converter'city_converter')]
  53.     #[Route("/api/saloons/listing/city/{city}"name"api.saloon_listing.by_city"methods"GET"format"json")]
  54.     #[OA\Parameter(name"page"in"query"schema: new OA\Schema(type"integer", default: 1minimum1))]
  55.     #[OA\Tag(name"SaloonListing")]
  56.     #[OA\Response(
  57.         response200,
  58.         description'',
  59.         content: new OA\JsonContent(ref"#/components/schemas/SaloonListingPage")
  60.     )]
  61.     public function listByCity(Request $requestCity $city): Response
  62.     {
  63.         $criteria Spec::andX(
  64.             $this->features->free_profiles() ? new SaloonIsNotHidden() : new SaloonIsActive(),
  65.             SaloonIsLocated::withinCity($city),
  66.             $this->features->free_profiles() ? new FreeProfilesFeatureSaloonOrder() : new SaloonOrderedByStatus()
  67.         );
  68.         $result $this->saloonRepository->matchingSpec($criteria);
  69.         $saloons $this->takePage($result$this->perPage);
  70.         if ($this->isApiRequest($request)) {
  71.             return $this->json($saloons);
  72.         }
  73.         return $this->render('SaloonList/list.html.twig', [
  74.             'saloons' => $saloons,
  75.         ]);
  76.     }
  77.     /**
  78.      * @Feature("has_saloons")
  79.      */
  80.     #[ParamConverter('city'converter'city_converter')]
  81.     public function listForVipRelax(CountryCurrencyResolver $countryCurrencyResolverRequest $requestCity $city): Response
  82.     {
  83.         $minPrice $countryCurrencyResolver->getValueByCountryCode($city->getCountryCode(), [
  84.             'RUB' => 4000,
  85.             'UAH' => 1200,
  86.             'USD' => 100,
  87.             'EUR' => 100,
  88.         ]);
  89.         $districts = [];
  90.         foreach (SaloonInMoskowDistricts::$districtsUri as $uri) {
  91.             if (null !== $district $this->districtRepository->ofUriIdentityWithinCity($uri$city)) {
  92.                 $districts[] = $district;
  93.             }
  94.         }
  95.         if (!empty($districts)) {
  96.             $criteria Spec::andX(
  97.                 $this->features->free_profiles() ? new SaloonIsNotHidden() : new SaloonIsActive(),
  98.                 SaloonIsLocated::withinCity($city),
  99.                 new SaloonIsVip($city$districts$minPrice),
  100.                 $this->features->free_profiles() ? new FreeProfilesFeatureSaloonOrder() : new SaloonOrderedByStatus()
  101.             );
  102.             $result $this->saloonRepository->matchingSpec($criteria);
  103.             $saloons $this->takePage($result$this->perPage);
  104.         } else {
  105.             $saloons $this->emptyPagination();
  106.         }
  107.         return $this->render('SaloonList/list.html.twig', [
  108.             'saloons' => $saloons,
  109.         ]);
  110.     }
  111.     protected function render(string $view, array $parameters = [], Response $response null): Response
  112.     {
  113.         if($this->requestStack->getCurrentRequest()->getMethod() == 'POST') {
  114.             $response parent::render('SaloonList/list.saloons.html.twig'$parameters$response);
  115.             $content preg_replace('/\s{2,}/'' '$response->getContent());
  116.             $response->setContent($content);
  117.             return $response;
  118.         } else {
  119.             return parent::render($view$parameters$response);
  120.         }
  121.     }
  122. }