<?php
namespace App\EventListener\PostValidate;
use App\DataTransformer\VariableContentOptionOutputDataTransformer;
use App\DTO\Option\VariableContentOutput;
use App\DTO\Option\VariableContent;
use App\DTO\VariableContentDTO;
use App\Service\Manager\OptionManager;
use App\Service\Manager\SiteManager;
use App\Service\UserProvider;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class VariableContentPostValidateTransformer implements EventSubscriberInterface
{
private $request;
private $siteManager;
private $optionManager;
private $userProvider;
private $transformer;
public function __construct(
VariableContentOptionOutputDataTransformer $transformer,
RequestStack $requestStack,
SiteManager $siteManager,
OptionManager $optionManager,
UserProvider $userProvider
) {
$this->request = $requestStack->getCurrentRequest();
$this->siteManager = $siteManager;
$this->optionManager = $optionManager;
$this->userProvider = $userProvider;
$this->transformer = $transformer;
}
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
public function supportTransformation($payload)
{
return $payload instanceof VariableContent;
}
public function transform(ViewEvent $event)
{
/** @var VariableContent $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload)) {
return;
}
$site = $this->siteManager->getSiteById($this->request->get('id'));
if ($site === null) {
throw new NotFoundHttpException();
}
$newConfiguration = new VariableContentDTO();
$newConfiguration->setIsEnabled($payload->isEnabled);
if (null === $variableContentConfiguration = $this->optionManager->getVariableContentOptionForSite($site)) {
$variableContentConfiguration = $this->optionManager->createVariableContent(
$site,
$this->userProvider->getUser(),
$newConfiguration,
true
);
}
if ($payload->isEnabled) {
$variableContentConfiguration->enableOption();
} else {
$variableContentConfiguration->disableOption();
}
$variableContentConfiguration->updateVariableContent($newConfiguration);
$this->optionManager->save($variableContentConfiguration);
$event->setResponse(
new JsonResponse(
$this->transformer->transform($variableContentConfiguration, VariableContentOutput::class)
)
);
}
}