src/Controller/Api/ClubSearchController.php line 96

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Entity\Club;
  4. use Hateoas\HateoasBuilder;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use App\Entity\ClubLocation;
  10. use OpenApi\Annotations as OA;
  11. use App\Media\MediaManager;
  12. use Psr\Log\LoggerInterface;
  13. use Symfony\Component\HttpKernel\KernelInterface;
  14. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  15. use App\Entity\ClubLesson;
  16. use App\Model\ClubLocationView;
  17. use App\Entity\City;
  18. use App\Model\CityModel;
  19. use App\Controller\ControllerUtils;
  20. use App\Service\ClubService;
  21. class ClubSearchController extends AbstractController
  22. {
  23.     private $logger;
  24.     public function __construct(LoggerInterface $logger)
  25.     {
  26.         $this->logger $logger;
  27.     }
  28.     /**
  29.      * @Route("/api/clubsearch", name="api_club_search", methods={"GET"})
  30.      * @OA\Get(
  31.      *     operationId="searchClub",
  32.      *     tags={"Club"},
  33.      *     path="/api/clubsearch",
  34.      *     summary="Search clubs",
  35.      *     @OA\Parameter(
  36.      *         description="Zip code",
  37.      *         in="query",
  38.      *         name="zc",
  39.      *         required=false,
  40.      *         @OA\Schema(
  41.      *             format="string",
  42.      *             type="string",
  43.      *             pattern="\d{4,6}"
  44.      *         )
  45.      *     ),
  46.      *     @OA\Parameter(
  47.      *         description="Distance in kilometers",
  48.      *         in="query",
  49.      *         name="d",
  50.      *         required=false,
  51.      *         @OA\Schema(
  52.      *             type="integer",
  53.      *             default=5
  54.      *         )
  55.      *     ),
  56.      *     @OA\Parameter(
  57.      *         description="Disciplines separated by comma",
  58.      *         in="query",
  59.      *         name="dis",
  60.      *         required=false,
  61.      *         @OA\Schema(
  62.      *             format="string",
  63.      *             type="string"
  64.      *         )
  65.      *     ),
  66.      *     @OA\Parameter(
  67.      *         description="Days of week separated by comma",
  68.      *         in="query",
  69.      *         name="days",
  70.      *         required=false,
  71.      *         @OA\Schema(
  72.      *             format="string",
  73.      *             type="string"
  74.      *         )
  75.      *     ),
  76.      *     @OA\Response(
  77.      *         response="200",
  78.      *         description="Successful",
  79.      *         @OA\MediaType(
  80.      *             mediaType="application/hal+json",
  81.      *             @OA\Schema(
  82.      *                 type="array",
  83.      *                 @OA\Items(ref="#/components/schemas/ClubLocation")
  84.      *             )
  85.      *         )
  86.      *     )
  87.      * )
  88.      */
  89.     public function search(Request $request)
  90.     {
  91.         $zipcode $request->query->get('zc''');
  92.         $distance $request->query->get('d'5);
  93.         $disciplines ControllerUtils::parseDisciplines($request->query->get('dis'''));
  94.         $days ControllerUtils::parseDays($request->query->get('days'''));
  95.         
  96.         $clubLocations $this->getDoctrine()->getManager()
  97.         ->getRepository(ClubLocation::class)
  98.         ->findByZipcodeAndDistance($zipcode$distance$disciplines$daystrue);
  99.         
  100.         $this->logger->debug('Search club around '.$zipcode.' in '.$distance.' km : '.count($clubLocations).' club(s)');
  101.         
  102.         //$clubLocationByIds = array();
  103.         $clubLocationIds = array();
  104.         foreach ($clubLocations as &$clubLocation) {
  105.             //$clubLocationByIds[$clubLocation->getId()] = new ClubLocationView($clubLocation);
  106.             array_push($clubLocationIds$clubLocation->getId());
  107.         }
  108.         
  109.         $clubs $clubLocations $this->getDoctrine()->getManager()
  110.             ->getRepository(Club::class)
  111.             ->findByClubLocationIds($clubLocationIds);
  112.         
  113.         $clubService = new ClubService($this->container->get('doctrine'));
  114.         $clubViews $clubService->convertToView($clubs);
  115.         
  116.         
  117.         $hateoas HateoasBuilder::create()->build();
  118.         $json json_decode($hateoas->serialize($clubViews'json'));
  119.         
  120.         return new Response(json_encode($json), 200, array(
  121.             'Content-Type' => 'application/hal+json'
  122.         ));
  123.     }
  124.     
  125. }