<?php
namespace App\EventListener\PostValidate;
use App\DTO\Invitation\InvitationRegistration;
use App\Service\Manager\ClientProfileManager;
use App\Service\Manager\SiteInviteManager;
use App\Service\Manager\UserManager;
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\HttpKernel\Exception\NotFoundHttpException;
class InvitationRegistrationPostValidateTransformer implements EventSubscriberInterface
{
private $siteInviteManager;
private $userManager;
private $clientProfileManager;
/**
* @var EntityManagerInterface
*/
private $entityManager;
public function __construct(
SiteInviteManager $siteInviteManager,
UserManager $userManager,
ClientProfileManager $clientProfileManager,
EntityManagerInterface $entityManager
) {
$this->siteInviteManager = $siteInviteManager;
$this->userManager = $userManager;
$this->clientProfileManager = $clientProfileManager;
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
public function supportTransformation($payload, Request $request)
{
return $payload instanceof InvitationRegistration && $request->isMethod($request::METHOD_POST);
}
public function transform(ViewEvent $event)
{
/** @var InvitationRegistration $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload, $event->getRequest())) {
return;
}
$siteInvite = $this->siteInviteManager->getInviteByEmailAndToken($payload->email, $payload->token);
if (null === $siteInvite) {
throw new NotFoundHttpException("Invitation not found");
}
$this->entityManager->getConnection()->beginTransaction();
try {
$user = $this->userManager->createUser(
$payload->email,
$payload->password,
null,
true,
['ROLE_CLIENT']
);
$this->clientProfileManager->createClientProfile(
$user,
$payload->name,
null,
null,
null,
null,
null,
$event->getRequest()->getLocale()
);
$this->siteInviteManager->acceptSiteInvite($siteInvite, $user);
$this->entityManager->refresh($user);
$this->entityManager->getConnection()->commit();
} catch (\Exception $e) {
$this->entityManager->getConnection()->rollBack();
throw $e;
}
$event->setResponse(new JsonResponse($this->userManager->normalize($user)));
}
}