src/V4/Controller/Prospect/PostProspectSearchFormAction.php line 24

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\V4\Controller\Prospect;
  4. use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
  5. use ApiPlatform\Core\Exception\ResourceClassNotSupportedException;
  6. use App\DataProvider\AbstractCollectionDataProvider;
  7. use App\DataProvider\RequestDataProviderTrait;
  8. use App\Service\ApiWebServiceFilterBuilder\PaginationFilterBuilder;
  9. use App\Service\Form\FormUtils;
  10. use App\V4\Model\Prospect\Prospect;
  11. use App\V4\Service\Prospect\ProspectFormHandler;
  12. use App\V4\Voters\ProspectVoter;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  18. use Symfony\Component\Serializer\Serializer;
  19. use Symfony\Component\Serializer\SerializerInterface;
  20. class PostProspectSearchFormAction extends AbstractController
  21. {
  22.     use FormUtils;
  23.     use RequestDataProviderTrait;
  24.     /**
  25.      * @var ProspectFormHandler
  26.      */
  27.     private $prospectFormHandler;
  28.     /**
  29.      * @var CollectionDataProviderInterface
  30.      */
  31.     private $collectionDataProvider;
  32.     /**
  33.      * @var Serializer
  34.      */
  35.     private $serializer;
  36.     /**
  37.      * @param ProspectFormHandler             $prospectFormHandler
  38.      * @param CollectionDataProviderInterface $collectionDataProvider
  39.      * @param Serializer                      $serializer
  40.      */
  41.     public function __construct(
  42.         ProspectFormHandler $prospectFormHandler,
  43.         CollectionDataProviderInterface $collectionDataProvider,
  44.         SerializerInterface $serializer
  45.     ) {
  46.         $this->prospectFormHandler $prospectFormHandler;
  47.         $this->collectionDataProvider $collectionDataProvider;
  48.         $this->serializer $serializer;
  49.     }
  50.     /**
  51.      * @param Request $request
  52.      *
  53.      * @return JsonResponse|iterable
  54.      *
  55.      * @throws ResourceClassNotSupportedException
  56.      * @throws ExceptionInterface
  57.      */
  58.     public function __invoke(Request $request)
  59.     {
  60.         $this->denyAccessUnlessGranted(ProspectVoter::PROSPECT_SHOW_LIST);
  61.         $prospectSearchForm $this->prospectFormHandler->handleProspectSearchForm(
  62.             $request->getContent(),
  63.             'true' === $request->query->get('isGeolocationSearch''false')
  64.         );
  65.         if (!$prospectSearchForm->isSubmitted() || !$prospectSearchForm->isValid()) {
  66.             return new JsonResponse([
  67.                 'code' => Response::HTTP_BAD_REQUEST,
  68.                 'data' => $this->convertFormErrorsToArray($prospectSearchForm),
  69.                 'errorMessage' => 'prospect_form_search',
  70.             ], Response::HTTP_BAD_REQUEST);
  71.         }
  72.         $searchBody $this->completeSearchBodyFromRequest(
  73.             $request,
  74.             json_decode($this->serializer->serialize($prospectSearchForm->getData(), 'json'), true)
  75.         );
  76.         $searchBody $this->replaceFormKeyToSearchKey($prospectSearchForm$searchBody);
  77.         if ('true' === $request->query->get('isGeolocationSearch''false')) {
  78.             $searchBody array_merge($searchBody, [
  79.                 PaginationFilterBuilder::ACTIVATE_PAGNIATION_KEY => 'false',
  80.             ]);
  81.         }
  82.         $transformResponse = !$request->query->get('disableTransformation'false);
  83.         $response $this
  84.             ->collectionDataProvider
  85.             ->getCollection(Prospect::class, null, [
  86.                 'filters' => $searchBody,
  87.                 AbstractCollectionDataProvider::CONTEXT_TAB => $request->query->get('tab'),
  88.                 'transformResponse' => $transformResponse,
  89.             ])
  90.         ;
  91.         if ($transformResponse) {
  92.             return new JsonResponse($response);
  93.         }
  94.         return $response;
  95.     }
  96. }