<?php
namespace App\EventListener\PostValidate;
use ApiPlatform\Core\Validator\ValidatorInterface;
use App\DTO\PopupCampaignItem\PopupCampaignItem;
use App\Entity\PopupCampaignItem as Entity;
use App\Service\AfterReadStorage;
use App\Service\Manager\PopupCampaignItemManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class PopupCampaignItemPostValidateTransformer implements EventSubscriberInterface
{
/**
* @var AfterReadStorage
*/
private $afterReadStorage;
/**
* @var PopupCampaignItemManager
*/
private $popupCampaignItemManager;
/**
* @var DenormalizerInterface
*/
private $denormalizer;
/**
* @var ValidatorInterface
*/
private $validator;
/**
* @var NormalizerInterface
*/
private $normalizer;
public function __construct(
AfterReadStorage $afterReadStorage,
PopupCampaignItemManager $popupCampaignItemManager,
DenormalizerInterface $denormalizer,
ValidatorInterface $validator,
NormalizerInterface $normalizer
) {
$this->afterReadStorage = $afterReadStorage;
$this->popupCampaignItemManager = $popupCampaignItemManager;
$this->denormalizer = $denormalizer;
$this->validator = $validator;
$this->normalizer = $normalizer;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
/**
* @param PopupCampaignItem $payload
*
* @return bool
*/
public function supportTransformation($payload)
{
return $payload instanceof PopupCampaignItem;
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
/** @var PopupCampaignItem $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload)) {
return;
}
$popupCampaignItem = null;
if ($event->getRequest()->isMethod(Request::METHOD_PUT)) {
/** @var Entity $popupCampaignItem */
$popupCampaignItem = $this->afterReadStorage->getObject();
if ($payload->data) {
$data = $this->denormalizer->denormalize(
$payload->data,
$this->popupCampaignItemManager->getDataType($popupCampaignItem)
);
$this->validator->validate($data);
$popupCampaignItem->update((array) $data);
}
$this->popupCampaignItemManager->save($popupCampaignItem);
}
if (null !== $popupCampaignItem) {
$event->setResponse(new JsonResponse($this->normalizer->normalize($popupCampaignItem)));
}
}
}