<?php
declare(strict_types=1);
namespace App\V4\Controller\Quote;
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use ApiPlatform\Core\Exception\ResourceClassNotSupportedException;
use App\DataProvider\AbstractCollectionDataProvider;
use App\DataProvider\RequestDataProviderTrait;
use App\Service\Form\FormUtils;
use App\V4\Model\ChildrenAwareInterface;
use App\V4\Model\Quote\Quote;
use App\V4\Service\Quote\QuoteFormHandler;
use App\V4\Voters\QuoteVoter;
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\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
class PostQuoteSearchFormAction extends AbstractController
{
use FormUtils;
use RequestDataProviderTrait;
/**
* @var QuoteFormHandler
*/
private $quoteFormHandler;
/**
* @var CollectionDataProviderInterface
*/
private $collectionDataProvider;
/**
* @var Serializer
*/
private $serializer;
/**
* @param QuoteFormHandler $quoteFormHandler
* @param CollectionDataProviderInterface $collectionDataProvider
* @param Serializer $serializer
*/
public function __construct(
QuoteFormHandler $quoteFormHandler,
CollectionDataProviderInterface $collectionDataProvider,
SerializerInterface $serializer
) {
$this->quoteFormHandler = $quoteFormHandler;
$this->collectionDataProvider = $collectionDataProvider;
$this->serializer = $serializer;
}
/**
* @param Request $request
*
* @return JsonResponse|iterable
*
* @throws ResourceClassNotSupportedException
*/
public function __invoke(Request $request)
{
$this->denyAccessUnlessGranted(QuoteVoter::QUOTE_SHOW_LIST);
$search = json_decode($request->getContent(), true) ?? [];
if (null !== $request->get('prospectId')) {
$search['prospectIds'] = [$request->get('prospectId')];
}
$quoteSearchForm = $this->quoteFormHandler->handleQuoteSearchForm($request->query->get('tab'), $search);
if (!$quoteSearchForm->isSubmitted() || !$quoteSearchForm->isValid()) {
return new JsonResponse([
'code' => Response::HTTP_BAD_REQUEST,
'data' => $this->convertFormErrorsToArray($quoteSearchForm),
'errorMessage' => 'quote_form_search',
], Response::HTTP_BAD_REQUEST);
}
$searchBody = $this->completeSearchBodyFromRequest(
$request,
array_merge(
json_decode($this->serializer->serialize($quoteSearchForm->getData(), 'json'), true),
$request->query->has('status_isWon') ? ['status_isWon' => $request->query->get('status_isWon')] : [],
$request->query->has('status_inProgress') ? ['status_inProgress' => $request->query->get('status_inProgress')] : [],
[ChildrenAwareInterface::FILTER_EXCLUDE_PARENT_ENTITIES => 'true']
)
);
$searchBody = $this->replaceFormKeyToSearchKey($quoteSearchForm, $searchBody);
$transformResponse = !$request->query->get('disableTransformation', false);
$response = $this
->collectionDataProvider
->getCollection(Quote::class, null, [
'filters' => $searchBody,
AbstractCollectionDataProvider::CONTEXT_TAB => $request->query->get('tab'),
'transformResponse' => $transformResponse,
])
;
if ($transformResponse) {
return new JsonResponse($response);
}
return $response;
}
}