<?php
namespace App\EventListener\PostValidate;
use App\DataTransformer\TabMessageOptionOutputDataTransformer;
use App\DTO\Option\TabMessage;
use App\DTO\Option\TabMessageOutput;
use App\DTO\TabMessageDTO;
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 TabMessagePostValidateTransformer implements EventSubscriberInterface
{
private $request;
private $siteManager;
private $optionManager;
private $userProvider;
private $transformer;
public function __construct(
TabMessageOptionOutputDataTransformer $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 TabMessage;
}
public function transform(ViewEvent $event)
{
/** @var TabMessage $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 TabMessageDTO();
$newConfiguration->setFirstMessage($payload->firstMessage);
$newConfiguration->setSecondMessage($payload->secondMessage);
$newConfiguration->setAfterMessage($payload->afterMessage);
$newConfiguration->setDisplayDelay($payload->displayDelay);
$newConfiguration->setPersonalization($payload->personalization);
$newConfiguration->setIsEnabled($payload->isEnabled);
if (null === $backToTabConfiguration = $this->optionManager->getBackToTabForSite($site)) {
$backToTabConfiguration = $this->optionManager->createCustomTabMessage(
$site,
$this->userProvider->getUser(),
$newConfiguration,
true
);
}
if ($payload->isEnabled) {
$backToTabConfiguration->enableOption();
} else {
$backToTabConfiguration->disableOption();
}
$backToTabConfiguration->updateCustomTabMessage($newConfiguration);
$this->optionManager->save($backToTabConfiguration);
$event->setResponse(
new JsonResponse(
$this->transformer->transform($backToTabConfiguration, TabMessageOutput::class)
)
);
}
}