<?php
declare(strict_types=1);
namespace App\V4\Controller\Prospect;
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use ApiPlatform\Core\Exception\ResourceClassNotSupportedException;
use App\DataProvider\AbstractCollectionDataProvider;
use App\DataProvider\RequestDataProviderTrait;
use App\Service\ApiWebServiceFilterBuilder\PaginationFilterBuilder;
use App\Service\Form\FormUtils;
use App\V4\Model\Prospect\Prospect;
use App\V4\Service\Prospect\ProspectFormHandler;
use App\V4\Voters\ProspectVoter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\Exception\ExceptionInterface;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
class PostProspectSearchFormAction extends AbstractController
{
use FormUtils;
use RequestDataProviderTrait;
/**
* @var ProspectFormHandler
*/
private $prospectFormHandler;
/**
* @var CollectionDataProviderInterface
*/
private $collectionDataProvider;
/**
* @var Serializer
*/
private $serializer;
/**
* @param ProspectFormHandler $prospectFormHandler
* @param CollectionDataProviderInterface $collectionDataProvider
* @param Serializer $serializer
*/
public function __construct(
ProspectFormHandler $prospectFormHandler,
CollectionDataProviderInterface $collectionDataProvider,
SerializerInterface $serializer
) {
$this->prospectFormHandler = $prospectFormHandler;
$this->collectionDataProvider = $collectionDataProvider;
$this->serializer = $serializer;
}
/**
* @param Request $request
*
* @return JsonResponse|iterable
*
* @throws ResourceClassNotSupportedException
* @throws ExceptionInterface
*/
public function __invoke(Request $request)
{
$this->denyAccessUnlessGranted(ProspectVoter::PROSPECT_SHOW_LIST);
$prospectSearchForm = $this->prospectFormHandler->handleProspectSearchForm(
$request->getContent(),
'true' === $request->query->get('isGeolocationSearch', 'false')
);
if (!$prospectSearchForm->isSubmitted() || !$prospectSearchForm->isValid()) {
return new JsonResponse([
'code' => Response::HTTP_BAD_REQUEST,
'data' => $this->convertFormErrorsToArray($prospectSearchForm),
'errorMessage' => 'prospect_form_search',
], Response::HTTP_BAD_REQUEST);
}
$searchBody = $this->completeSearchBodyFromRequest(
$request,
json_decode($this->serializer->serialize($prospectSearchForm->getData(), 'json'), true)
);
$searchBody = $this->replaceFormKeyToSearchKey($prospectSearchForm, $searchBody);
if ('true' === $request->query->get('isGeolocationSearch', 'false')) {
$searchBody = array_merge($searchBody, [
PaginationFilterBuilder::ACTIVATE_PAGNIATION_KEY => 'false',
]);
}
$transformResponse = !$request->query->get('disableTransformation', false);
$response = $this
->collectionDataProvider
->getCollection(Prospect::class, null, [
'filters' => $searchBody,
AbstractCollectionDataProvider::CONTEXT_TAB => $request->query->get('tab'),
'transformResponse' => $transformResponse,
])
;
if ($transformResponse) {
return new JsonResponse($response);
}
return $response;
}
}