<?php
namespace App\V4\Controller\Quote;
use App\DataPersister\CustomerFile\CustomerFileDataPersister;
use App\Model\CustomerFile\CustomerFile;
use App\V4\Controller\AbstractDataPersisterAction;
use App\V4\DataPersister\Quote\QuoteDataPersister;
use App\V4\Logger\SentryLogger;
use App\V4\Model\Quote\Quote;
use ReflectionException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
class QuoteDataPersisterAction extends AbstractDataPersisterAction
{
/**
* @var CustomerFileDataPersister
*/
private $customerFileDataPersister;
/**
* @var SentryLogger
*/
private $sentryLogger;
/**
* @param QuoteDataPersister $quoteDataPersister
* @param CustomerFileDataPersister $customerFileDataPersister
* @param SentryLogger $sentryLogger
*/
public function __construct(
QuoteDataPersister $quoteDataPersister,
CustomerFileDataPersister $customerFileDataPersister,
SentryLogger $sentryLogger
) {
parent::__construct($quoteDataPersister);
$this->customerFileDataPersister = $customerFileDataPersister;
$this->sentryLogger = $sentryLogger;
}
/**
* {@inheritdoc}
*/
public function __invoke(Request $request, $data = null, ?string $id = null)
{
/** @var Quote|Response $quoteOrResponse */
$quoteOrResponse = parent::__invoke($request, $data, $id);
if (null === $quoteOrResponse) {
return [];
}
if ($quoteOrResponse instanceof Response && !$quoteOrResponse->isSuccessful()) {
return $quoteOrResponse;
}
$this->handleFiles($request, $quoteOrResponse);
return $quoteOrResponse;
}
/**
* @param Request $request
* @param Quote $quote
*
* @return void
*
* @throws \Exception
*/
private function handleFiles(Request $request, Quote $quote): void
{
// Handle files: should delete current files ?
foreach ($request->request->get('customerFiles', []) as $key => $currentCustomerFile) {
if ($currentCustomerFile['shouldDelete'] ?? false) {
try {
$realCustomerFile = $quote->getCustomerFiles()[$key] ?? null;
if (null !== $realCustomerFile && null !== $realCustomerFile->getId()) {
$this->customerFileDataPersister->remove($realCustomerFile);
$quote->removeCustomerFile($realCustomerFile);
}
} catch (TransportExceptionInterface $e) {
$this->sentryLogger->captureException(
SentryLogger::CHANNEL_DATA_PERSISTER,
$e,
[
'catchOnClass' => self::class,
'customerFileId' => $realCustomerFile->getId(),
]
);
}
}
}
// Handle files: should upload new files
foreach ($request->files->get('customerFiles', []) as $key => $newCustomerFile) {
$customerFileData = ['quoteId' => $quote->getId()];
try {
$realCustomerFile = $this->customerFileDataPersister->persistCustomerFile($customerFileData, $newCustomerFile['customerFile']['file']);
$quote->addCustomerFile((new CustomerFile())->importFromData($realCustomerFile));
$allCF = $quote->getCustomerFiles();
unset($allCF[$key]);
$quote->setCustomerFiles($allCF);
} catch (TransportExceptionInterface | ReflectionException $e) {
$this->sentryLogger->captureException(
SentryLogger::CHANNEL_DATA_PERSISTER,
$e,
[
'catchOnClass' => self::class,
'quoteId' => $quote->getId(),
]
);
}
}
}
}