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