<?php
namespace App\Modules\Cemetery\EventSubscriber\Record;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Repository\App\Ticket\TicketRepository;
use App\Services\UtilsService;
use DateTimeZone;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use App\Services\TicketService;
class RecordPostSerializerSubscriber implements EventSubscriberInterface
{
private $ticketService;
private $utilsService;
private $ticketRepository;
public function __construct(
TicketService $ticketService,
UtilsService $utilsService,
TicketRepository $ticketRepository)
{
$this->ticketService = $ticketService;
$this->utilsService = $utilsService;
$this->ticketRepository = $ticketRepository;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
KernelEvents::VIEW => ['onKernelView', EventPriorities::POST_SERIALIZE]
];
}
/**
* @param ViewEvent $event
* @throws \App\Exception\AccessDeniedException
* @throws \Doctrine\ORM\NonUniqueResultException
*/
public function onKernelView(ViewEvent $event)
{
if ($this->utilsService->isAPublicRequest($event)) {
return;
}
$request = $event->getRequest();
$route = $request->attributes->get('_route');
$routes = array(
'api_records_create_record_collection',
'api_records_get_records_collection',
'api_records_get_item',
'api_records_put_item'
);
if (!in_array($route, $routes))
return;
$this->ticketRepository->disableSoftDeleteable();
$recordResult = $event->getControllerResult();
$recordResult = json_decode($recordResult, true);
if(empty($recordResult)){
return;
}
if ('api_records_get_records_collection' === $route) {
foreach ($recordResult as &$record) {
$record['ticket'] = $this->ticketService->formatNormalize($record['ticket']);
if(!is_null($record["ticket"]["dateExpiration"])){
$this->setDateToTicket($record);
}
}
} else {
$recordResult['ticket'] = $this->ticketService->formatNormalize($recordResult['ticket']);
if(!is_null($recordResult["ticket"]["dateExpiration"])) {
$this->setDateToTicket($recordResult['ticket']);
}
}
$recordResult = json_encode($recordResult);
$event->setControllerResult($recordResult);
}
/**
* @param $ticket
* @return int
*/
private function setDateToTicket(&$ticket){
try {
$dateZone = new \DateTime($ticket["dateExpiration"], new \DateTimeZone($ticket["vendorTimeZone"]));;
$dataZoneSecondsOffSet = $dateZone->getOffset();
$timeStamp = $dateZone->getTimestamp() - $dataZoneSecondsOffSet;
$ticket["dateExpiration"] = $dateZone->setTimestamp($timeStamp)->format('Y-m-d\TH:i:sP');
}catch (\Exception $exception){
return -1;
}
}
}