<?php
namespace App\EventListener\PostValidate;
use App\DTO\Popup\Popup;
use App\Entity\Popup as Entity;
use App\Service\AfterReadStorage;
use App\Service\Manager\FavoriteGifManager;
use App\Service\Manager\MediaManager;
use App\Service\Manager\PopupManager;
use App\Service\Manager\PopupTypeManager;
use App\Service\Manager\SiteManager;
use App\Service\UserProvider;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class PopupPostValidateTransformer implements EventSubscriberInterface
{
private $popupTypeManager;
private $userProvider;
private $siteManager;
private $popupManager;
private $normalizer;
private $mediaManager;
private $afterReadStorage;
private $favoriteGifManager;
public function __construct(
UserProvider $userProvider,
PopupTypeManager $popupTypeManager,
SiteManager $siteManager,
PopupManager $popupManager,
MediaManager $mediaManager,
NormalizerInterface $normalizer,
AfterReadStorage $afterReadStorage,
FavoriteGifManager $favoriteGifManager
) {
$this->popupTypeManager = $popupTypeManager;
$this->userProvider = $userProvider;
$this->siteManager = $siteManager;
$this->popupManager = $popupManager;
$this->normalizer = $normalizer;
$this->mediaManager = $mediaManager;
$this->afterReadStorage = $afterReadStorage;
$this->favoriteGifManager = $favoriteGifManager;
}
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
public function supportTransformation($payload, Request $request)
{
return $payload instanceof Popup &&
($request->isMethod($request::METHOD_POST) || $request->isMethod($request::METHOD_PUT));
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
$request = $event->getRequest();
/** @var Popup $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload, $request)) {
return;
}
if (null === $type = $this->popupTypeManager->getOneById($payload->type)) {
throw new BadRequestHttpException("Type not found");
}
if (null === $site = $this->siteManager->getSiteById($event->getRequest()->get('id'))) {
throw new BadRequestHttpException("Site not found");
}
$media = null;
if ($payload->media !== null) {
$media = $this->mediaManager->getOneByGuid($payload->media);
}
$logo = null;
if ($payload->logo !== null) {
$logo = $this->mediaManager->getOneByGuid($payload->logo);
}
$popup = null;
if ($request->isMethod($request::METHOD_POST)) {
$popup = $this->popupManager->create(Entity::create(
$this->userProvider->getUser(),
$site,
$type,
$payload->isEnabled,
$media,
$logo,
$payload->getConfigurationAsArray()
));
}
if ($request->isMethod($request::METHOD_PUT)) {
/** @var Entity $popup */
$popup = $this->afterReadStorage->getObject();
$popup->update(
$this->userProvider->getUser(),
$site,
$type,
$payload->isEnabled,
$media,
$logo,
$payload->getConfigurationAsArray()
);
$this->popupManager->save($popup);
}
if (null !== $popup) {
$event->setResponse(new JsonResponse($this->normalizer->normalize($popup)));
}
}
}