<?php
namespace App\EventListener\PostValidate;
use App\DTO\MailConfiguration\MailConfiguration;
use App\DTO\MailConfiguration\MailConfigurationOutput;
use App\Entity\MailConfiguration as Entity;
use App\Entity\Site;
use App\Repository\SiteRepository;
use App\Service\AfterReadStorage;
use App\Service\Manager\MailConfigurationManager;
use App\Service\Manager\MediaManager;
use App\Service\SiteNotificationSender;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class MailConfigurationPostValidateTransformer implements EventSubscriberInterface
{
/**
* @var AfterReadStorage
*/
private $afterReadStorage;
/**
* @var SiteRepository
*/
private $siteRepository;
/**
* @var NormalizerInterface
*/
private $normalizer;
/**
* @var MailConfigurationManager
*/
private $mailConfigurationManager;
/**
* @var SiteNotificationSender
*/
private $notificationSender;
/**
* @var MediaManager
*/
private $mediaManager;
public function __construct(
AfterReadStorage $afterReadStorage,
SiteRepository $siteRepository,
NormalizerInterface $normalizer,
MailConfigurationManager $mailConfigurationManager,
SiteNotificationSender $notificationSender,
MediaManager $mediaManager
) {
$this->afterReadStorage = $afterReadStorage;
$this->siteRepository = $siteRepository;
$this->normalizer = $normalizer;
$this->mailConfigurationManager = $mailConfigurationManager;
$this->notificationSender = $notificationSender;
$this->mediaManager = $mediaManager;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
/**
* @param MailConfiguration $payload
*
* @return bool
*/
public function supportTransformation($payload)
{
return $payload instanceof MailConfiguration;
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
/** @var MailConfiguration $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload)) {
return;
}
/** @var Site|null $site */
if (null === $site = $this->siteRepository->find($event->getRequest()->get('id'))) {
throw new BadRequestHttpException("Site not found");
}
$logo = null;
if ($payload->logo !== null) {
$logo = $this->mediaManager->getOneByGuid($payload->logo);
}
/** @var Entity|null $mailConfiguration */
$mailConfiguration = $site->getAccount()->getMailConfiguration();
if (null !== $mailConfiguration) {
$mailConfiguration->update(
$payload->sender,
$payload->email,
$payload->host,
$payload->port,
$payload->login,
$payload->password,
$logo,
$payload->isActive
);
} else {
$mailConfiguration = Entity::create(
$payload->sender,
$payload->email,
$site->getAccount(),
$payload->host,
$payload->port,
$payload->login,
$payload->password,
$logo,
$payload->isActive
);
}
$this->mailConfigurationManager->save($mailConfiguration);
$this->notificationSender->sendConfigInfoEmail($mailConfiguration);
$event->setResponse(new JsonResponse($this->normalizer->normalize($mailConfiguration, MailConfigurationOutput::class)));
}
}