<?php
namespace App\Controller\CustomerFile;
use App\DataPersister\CustomerFile\CustomerFileDataPersister;
use App\DataProvider\CustomerFile\CustomerFileItemDataProvider;
use App\Model\CustomerFile\CustomerFile;
use App\Service\CustomerFile\CustomerFileDownloadManager;
use App\V4\Logger\SentryLogger;
use ReflectionException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use Throwable;
/**
* Class CustomerFileController.
*/
final class CustomerFileController extends AbstractController
{
/**
* CustomerFiles POST Action.
*
* @Route("/api/customer_files", name="customer_files_post_route", methods={"POST"})
*
* @param Request $request
* @param CustomerFileDataPersister $customerFileDataPersister
*
* @return JsonResponse
*
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function customerFilesPostAction(Request $request, CustomerFileDataPersister $customerFileDataPersister): JsonResponse
{
$json = json_decode($request->get('request'), true);
if ($request->files->get('customerFile')) {
return new JsonResponse($customerFileDataPersister->persistCustomerFile($json, $request->files->get('customerFile')));
}
if (is_array($request->files->get('customerFiles'))) {
$fileResponses = [];
foreach ($request->files->get('customerFiles') as $customerFile) {
$fileResponses[] = $customerFileDataPersister->persistCustomerFile($json, $customerFile);
}
return new JsonResponse($fileResponses);
}
return new JsonResponse(['error' => 'No file uploaded', Response::HTTP_INTERNAL_SERVER_ERROR]);
}
/**
* CustomerFiles PUT Action.
*
* @Route("/api/customer_files", name="customer_files_put_route", methods={"put"})
*
* @param Request $request
* @param CustomerFileDataPersister $customerFileDataPersister
*
* @return JsonResponse
*
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function customerFilesPutAction(Request $request, CustomerFileDataPersister $customerFileDataPersister): JsonResponse
{
$json = json_decode($request->getContent(), true);
return new JsonResponse($customerFileDataPersister->persistCustomerFile($json, $request->files->get('customerFile')));
}
/**
* CustomerFiles DELETE Action.
*
* @Route("/api/customer_files/{id}", name="customer_files_delete_route", methods={"DELETE"})
*
* @param string $id
* @param Request $request
* @param CustomerFileDataPersister $customerFileDataPersister
* @param CustomerFileItemDataProvider $customerFileItemDataProvider
*
* @return JsonResponse
*
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
* @throws ReflectionException
*/
public function customerFilesDeleteAction(
string $id,
Request $request,
CustomerFileDataPersister $customerFileDataPersister,
CustomerFileItemDataProvider $customerFileItemDataProvider
): JsonResponse {
$customerFile = $customerFileItemDataProvider->getItem(CustomerFile::class, $id);
return new JsonResponse($customerFileDataPersister->remove($customerFile), Response::HTTP_NO_CONTENT);
}
/**
* CustomerFiles DOWNLOAD Action.
*
* @Route("/api/files/download/{id}", name="files_download_route", methods={"GET"})
*
* @param string $id
* @param CustomerFileDownloadManager $customerFileDownloadManager
* @param CustomerFileItemDataProvider $customerFileItemDataProvider
*
* @return void
*
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ReflectionException
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function customerFilesDownloadPostAction(
string $id,
CustomerFileDownloadManager $customerFileDownloadManager,
CustomerFileItemDataProvider $customerFileItemDataProvider
): BinaryFileResponse {
/** @var CustomerFile $customerFile */
$customerFile = $customerFileItemDataProvider->getItem(CustomerFile::class, $id);
$label = $this->getCustomerFileLabel($customerFile);
return (new BinaryFileResponse($customerFileDownloadManager->getFile($customerFile)))
->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $label)
->deleteFileAfterSend();
}
/**
* CustomerFiles VIEW Action.
*
* @Route("/api/files/view/{id}", name="files_view_route", methods={"GET"})
*
* @param string $id
* @param CustomerFileDownloadManager $customerFileDownloadManager
* @param CustomerFileItemDataProvider $customerFileItemDataProvider
*
* @return void
*
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ReflectionException
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function customerFilesViewAction(
string $id,
CustomerFileDownloadManager $customerFileDownloadManager,
CustomerFileItemDataProvider $customerFileItemDataProvider
): BinaryFileResponse {
/** @var CustomerFile $customerFile */
$customerFile = $customerFileItemDataProvider->getItem(CustomerFile::class, $id);
$label = $this->getCustomerFileLabel($customerFile);
return (new BinaryFileResponse($customerFileDownloadManager->getFile($customerFile)))
->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE, $label)
->deleteFileAfterSend();
}
/**
* CustomerFiles Show logo Action.
*
* @Route("/api/logo/{id}", name="customer_logo_dl", methods={"GET"})
*
* @param CustomerFileDownloadManager $customerFileDownloadManager
* @param string $id
* @param SentryLogger $sentryLogger
*
* @return BinaryFileResponse
*
* @throws \Exception
*/
public function downloadLogoAction(CustomerFileDownloadManager $customerFileDownloadManager, string $id, SentryLogger $sentryLogger): Response
{
try {
$response = new BinaryFileResponse($customerFileDownloadManager->getLogoWithId($id));
$response
->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE, 'logo.jpg')
->deleteFileAfterSend();
return $response;
} catch (Throwable $e) {
$sentryLogger->captureException(
SentryLogger::CHANNEL_CUSTOMER_SERVICE,
$e,
[
'catchOnClass' => self::class,
'idLogo' => $id,
]
);
}
return new Response(null, Response::HTTP_NOT_FOUND);
}
private function getCustomerFileLabel(CustomerFile $customerFile): string
{
$label = $customerFile->getRealFileName();
if (!empty($customerFile->getFileLabel())) {
$info = pathinfo($customerFile->getFileName());
$label = mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $customerFile->getFileLabel());
$label = mb_ereg_replace("([\.]{2,})", '', $label);
$label = (!empty($info['extension'])) ? $label.'.'.$info['extension'] : $label;
}
return $label;
}
}