src/V4/Controller/Quote/QuoteDataPersisterAction.php line 16

Open in your IDE?
  1. <?php
  2. namespace App\V4\Controller\Quote;
  3. use App\DataPersister\CustomerFile\CustomerFileDataPersister;
  4. use App\Model\CustomerFile\CustomerFile;
  5. use App\V4\Controller\AbstractDataPersisterAction;
  6. use App\V4\DataPersister\Quote\QuoteDataPersister;
  7. use App\V4\Logger\SentryLogger;
  8. use App\V4\Model\Quote\Quote;
  9. use ReflectionException;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  13. class QuoteDataPersisterAction extends AbstractDataPersisterAction
  14. {
  15.     /**
  16.      * @var CustomerFileDataPersister
  17.      */
  18.     private $customerFileDataPersister;
  19.     /**
  20.      * @var SentryLogger
  21.      */
  22.     private $sentryLogger;
  23.     /**
  24.      * @param QuoteDataPersister        $quoteDataPersister
  25.      * @param CustomerFileDataPersister $customerFileDataPersister
  26.      * @param SentryLogger              $sentryLogger
  27.      */
  28.     public function __construct(
  29.         QuoteDataPersister $quoteDataPersister,
  30.         CustomerFileDataPersister $customerFileDataPersister,
  31.         SentryLogger $sentryLogger
  32.     ) {
  33.         parent::__construct($quoteDataPersister);
  34.         $this->customerFileDataPersister $customerFileDataPersister;
  35.         $this->sentryLogger $sentryLogger;
  36.     }
  37.     /**
  38.      * {@inheritdoc}
  39.      */
  40.     public function __invoke(Request $request$data null, ?string $id null)
  41.     {
  42.         /** @var Quote|Response $quoteOrResponse */
  43.         $quoteOrResponse parent::__invoke($request$data$id);
  44.         if (null === $quoteOrResponse) {
  45.             return [];
  46.         }
  47.         if ($quoteOrResponse instanceof Response && !$quoteOrResponse->isSuccessful()) {
  48.             return $quoteOrResponse;
  49.         }
  50.         $this->handleFiles($request$quoteOrResponse);
  51.         return $quoteOrResponse;
  52.     }
  53.     /**
  54.      * @param Request $request
  55.      * @param Quote   $quote
  56.      *
  57.      * @return void
  58.      *
  59.      * @throws \Exception
  60.      */
  61.     private function handleFiles(Request $requestQuote $quote): void
  62.     {
  63.         // Handle files: should delete current files ?
  64.         foreach ($request->request->get('customerFiles', []) as $key => $currentCustomerFile) {
  65.             if ($currentCustomerFile['shouldDelete'] ?? false) {
  66.                 try {
  67.                     $realCustomerFile $quote->getCustomerFiles()[$key] ?? null;
  68.                     if (null !== $realCustomerFile && null !== $realCustomerFile->getId()) {
  69.                         $this->customerFileDataPersister->remove($realCustomerFile);
  70.                         $quote->removeCustomerFile($realCustomerFile);
  71.                     }
  72.                 } catch (TransportExceptionInterface $e) {
  73.                     $this->sentryLogger->captureException(
  74.                         SentryLogger::CHANNEL_DATA_PERSISTER,
  75.                         $e,
  76.                         [
  77.                             'catchOnClass' => self::class,
  78.                             'customerFileId' => $realCustomerFile->getId(),
  79.                         ]
  80.                     );
  81.                 }
  82.             }
  83.         }
  84.         // Handle files: should upload new files
  85.         foreach ($request->files->get('customerFiles', []) as $key => $newCustomerFile) {
  86.             $customerFileData = ['quoteId' => $quote->getId()];
  87.             try {
  88.                 $realCustomerFile $this->customerFileDataPersister->persistCustomerFile($customerFileData$newCustomerFile['customerFile']['file']);
  89.                 $quote->addCustomerFile((new CustomerFile())->importFromData($realCustomerFile));
  90.                 $allCF $quote->getCustomerFiles();
  91.                 unset($allCF[$key]);
  92.                 $quote->setCustomerFiles($allCF);
  93.             } catch (TransportExceptionInterface ReflectionException $e) {
  94.                 $this->sentryLogger->captureException(
  95.                     SentryLogger::CHANNEL_DATA_PERSISTER,
  96.                     $e,
  97.                     [
  98.                         'catchOnClass' => self::class,
  99.                         'quoteId' => $quote->getId(),
  100.                     ]
  101.                 );
  102.             }
  103.         }
  104.     }
  105. }