<?php
namespace App\EventListener\PostValidate;
use App\DTO\Site\AddSite;
use App\DTO\Site\SiteOutput;
use App\Service\Manager\AccountManager;
use App\Service\Manager\AccountPermissionManager;
use App\Service\Manager\SiteManager;
use App\Service\Manager\SitePermissionManager;
use App\Service\UserProvider;
use Doctrine\ORM\EntityManagerInterface;
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\NormalizerInterface;
class AddSitePostValidateTransformer implements EventSubscriberInterface
{
private $siteManager;
private $normalizer;
private $sitePermissionManager;
private $userProvider;
private $entityManager;
private $accountManager;
private $accountPermissionManager;
public function __construct(
SiteManager $siteManager,
SitePermissionManager $sitePermissionManager,
NormalizerInterface $normalizer,
UserProvider $userProvider,
EntityManagerInterface $entityManager,
AccountManager $accountManager,
AccountPermissionManager $accountPermissionManager
) {
$this->siteManager = $siteManager;
$this->normalizer = $normalizer;
$this->sitePermissionManager = $sitePermissionManager;
$this->userProvider = $userProvider;
$this->entityManager = $entityManager;
$this->accountManager = $accountManager;
$this->accountPermissionManager = $accountPermissionManager;
}
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
public function supportTransformation($payload, Request $request)
{
return $payload instanceof AddSite && $request->isMethod($request::METHOD_POST);
}
public function transform(ViewEvent $event)
{
/** @var AddSite $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload, $event->getRequest())) {
return;
}
$user = $this->userProvider->getUser();
$this->entityManager->getConnection()->beginTransaction();
try {
if (null === $payload->account) {
$account = $this->accountManager->create($user);
$this->accountPermissionManager->createPermissionTypeOwner($account, $user);
$accountId = $account->getId();
} else {
$accountId = $payload->account;
}
$site = $this->siteManager->create($accountId, $payload->hostName);
$this->sitePermissionManager->createPermissionTypeOwner($site, $user);
$this->entityManager->getConnection()->commit();
} catch (\Exception $e) {
$this->entityManager->getConnection()->rollBack();
throw $e;
}
$event->setResponse(new JsonResponse($this->normalizer->normalize($site, SiteOutput::class)));
}
}