<?php
namespace App\EventListener\PostValidate;
use App\DTO\SitePermission\UpdateSitePermission;
use App\Entity\SitePermission;
use App\Service\AfterReadStorage;
use App\Service\Manager\SitePermissionManager;
use App\Service\Manager\SitePermissionTypeManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class UpdateSitePermissionPostValidateTransformation implements EventSubscriberInterface
{
private $request;
private $sitePermissionManager;
private $afterReadStorage;
private $sitePermissionTypeManager;
public function __construct(
RequestStack $requestStack,
SitePermissionManager $sitePermissionManager,
SitePermissionTypeManager $sitePermissionTypeManager,
AfterReadStorage $afterReadStorage
) {
$this->request = $requestStack->getCurrentRequest();
$this->sitePermissionManager = $sitePermissionManager;
$this->afterReadStorage = $afterReadStorage;
$this->sitePermissionTypeManager = $sitePermissionTypeManager;
}
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
public function supportTransformation($payload, Request $request)
{
return $payload instanceof UpdateSitePermission && $request->isMethod($request::METHOD_PUT);
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
/** @var UpdateSitePermission $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload, $event->getRequest())) {
return;
}
if (null === $permissionType = $this->sitePermissionTypeManager->getPermissionTypeById($payload->permission)) {
throw new NotFoundHttpException("No such permission");
}
/** @var SitePermission $sitePermission */
$sitePermission = $this->afterReadStorage->getObject();
$this->sitePermissionManager->updateSitePermission($sitePermission, $permissionType);
$this->sitePermissionManager->save($sitePermission);
$event->setResponse(new JsonResponse($this->sitePermissionManager->normalize($sitePermission)));
}
}