<?php
declare(strict_types=1);
namespace App\V4\Controller\Task;
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\Task\Task;
use App\V4\Service\Task\TaskFormHandler;
use App\V4\Voters\TaskVoter;
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 PostTaskSearchFormAction extends AbstractController
{
use FormUtils;
use RequestDataProviderTrait;
/**
* @var TaskFormHandler
*/
private $taskFormHandler;
/**
* @var CollectionDataProviderInterface
*/
private $collectionDataProvider;
/**
* @var Serializer
*/
private $serializer;
/**
* @param TaskFormHandler $taskFormHandler
* @param CollectionDataProviderInterface $collectionDataProvider
* @param Serializer $serializer
*/
public function __construct(
TaskFormHandler $taskFormHandler,
CollectionDataProviderInterface $collectionDataProvider,
SerializerInterface $serializer
) {
$this->taskFormHandler = $taskFormHandler;
$this->collectionDataProvider = $collectionDataProvider;
$this->serializer = $serializer;
}
/**
* @param Request $request
*
* @return JsonResponse|iterable
*
* @throws ResourceClassNotSupportedException
*/
public function __invoke(Request $request)
{
$this->denyAccessUnlessGranted(TaskVoter::TASK_SHOW_LIST);
$taskSearchForm = $this->taskFormHandler->handleTaskSearchForm($request->getContent());
if (!$taskSearchForm->isSubmitted() || !$taskSearchForm->isValid()) {
return new JsonResponse([
'code' => Response::HTTP_BAD_REQUEST,
'data' => $this->convertFormErrorsToArray($taskSearchForm),
'errorMessage' => 'task_form_search',
], Response::HTTP_BAD_REQUEST);
}
$searchBody = $this->completeSearchBodyFromRequest(
$request,
json_decode($this->serializer->serialize($taskSearchForm->getData(), 'json'), true)
);
$searchBody = $this->replaceFormKeyToSearchKey($taskSearchForm, $searchBody);
$transformResponse = !$request->query->get('disableTransformation', false);
$response = $this
->collectionDataProvider
->getCollection(Task::class, null, [
'filters' => $searchBody,
AbstractCollectionDataProvider::CONTEXT_TAB => $request->query->get('tab'),
'transformResponse' => $transformResponse,
])
;
if ($transformResponse) {
return new JsonResponse($response);
}
return $response;
}
}