src/V4/Action/Quote/PartialQuotePersistAction.php line 35

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\V4\Action\Quote;
  4. use ApiPlatform\Core\DataPersister\DataPersisterInterface;
  5. use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
  6. use ApiPlatform\Core\Exception\ResourceClassNotSupportedException;
  7. use App\Service\Form\FormUtils;
  8. use App\V4\DataPersister\AbstractWithoutRequestDataPersister;
  9. use App\V4\Form\Type\Quote\QuoteType;
  10. use App\V4\Model\Quote\Quote;
  11. use App\V4\Service\Pdf\PdfGenerator;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpClient\Exception\ClientException;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  20. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  21. /**
  22.  * Cette route a pour objectif d'autoriser un service
  23.  * externe à créer ou mettre à jours une entité (ici un devis)
  24.  * sans pour autant envoyer toutes les informations nécessaires
  25.  * et sans être contraint par les champs choisis par le client dans
  26.  * ses ViewOrders.
  27.  *
  28.  * @Route("/api/v4/quote/partial-persist", methods={"POST"})
  29.  * @Route("/api/v4/quote/{id}/partial-persist", methods={"PUT"})
  30.  */
  31. class PartialQuotePersistAction extends AbstractController
  32. {
  33.     use FormUtils;
  34.     /**
  35.      * @var ItemDataProviderInterface
  36.      */
  37.     private $itemDataProvider;
  38.     /**
  39.      * @var DataPersisterInterface
  40.      */
  41.     private $dataPersister;
  42.     /**
  43.      * @var PdfGenerator
  44.      */
  45.     private $pdfGenerator;
  46.     public function __construct(
  47.         ItemDataProviderInterface $itemDataProvider,
  48.         DataPersisterInterface $dataPersister,
  49.         PdfGenerator $pdfGenerator
  50.     ) {
  51.         $this->itemDataProvider $itemDataProvider;
  52.         $this->dataPersister $dataPersister;
  53.         $this->pdfGenerator $pdfGenerator;
  54.     }
  55.     /**
  56.      * @throws ExceptionInterface
  57.      * @throws ResourceClassNotSupportedException
  58.      * @throws TransportExceptionInterface
  59.      */
  60.     public function __invoke(Request $request, ?string $id null): JsonResponse
  61.     {
  62.         try {
  63.             $quote $this->getEntity($id);
  64.         } catch (NotFoundHttpException $exception) {
  65.             return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_NOT_FOUND);
  66.         }
  67.         $form $this->createForm(QuoteType::class, $quote, ['method' => null !== $id 'PUT' 'POST']);
  68.         $form->submit($request->get($form->getName()), false);
  69.         if (!$form->isSubmitted() || !$form->isValid()) {
  70.             return new JsonResponse($this->convertFormErrorsToArrayV4($form), Response::HTTP_UNPROCESSABLE_ENTITY);
  71.         }
  72.         /** @var Quote $quote */
  73.         $quote $form->getData();
  74.         $quote->getStatus()->setNormalizeAsIRI(true);
  75.         $this->dataPersister->persist($quote, [
  76.             AbstractWithoutRequestDataPersister::CONTEXT_IS_V4 => true,
  77.         ]);
  78.         /** @var Quote $quote */
  79.         $quote $this->itemDataProvider->getItem(Quote::class, $quote->getId());
  80.         $newPDF $form->get('newPdf')->getData();
  81.         if ($newPDF) {
  82.             $this->pdfGenerator->generatePdfForQuote($quote$newPDF);
  83.         }
  84.         return new JsonResponse([
  85.             'id' => $quote->getId(),
  86.         ], Response::HTTP_CREATED);
  87.     }
  88.     private function getEntity(?string $id): Quote
  89.     {
  90.         if (null === $id) {
  91.             return new Quote();
  92.         }
  93.         try {
  94.             $quote $this->itemDataProvider->getItem(Quote::class, $id);
  95.             if ($quote instanceof Quote) {
  96.                 return $quote;
  97.             }
  98.         } catch (ClientException $e) {
  99.         }
  100.         throw new NotFoundHttpException("Quote #$id not found.");
  101.     }
  102. }