<?php
declare(strict_types=1);
namespace Harmonizely\EventListener;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Harmonizely\Entity\Company\UserOAuthEntity;
use Harmonizely\Model\UserInterface;
use Harmonizely\Repository\Company\Contract\IUserOAuthRepository;
use Harmonizely\Service\Panel\OAuth\OAuthSession;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
final class RegistrationConfirmListener implements EventSubscriberInterface
{
private RouterInterface $router;
private SessionInterface $session;
private IUserOAuthRepository $userOAuthRepository;
private UrlGeneratorInterface $urlGenerator;
private TokenGeneratorInterface $tokenGenerator;
/**
* @param RouterInterface $router
* @param SessionInterface $session
* @param IUserOAuthRepository $userOAuthRepository
* @param UrlGeneratorInterface $urlGenerator
* @param TokenGeneratorInterface $tokenGenerator
*/
public function __construct(
RouterInterface $router,
SessionInterface $session,
IUserOAuthRepository $userOAuthRepository,
UrlGeneratorInterface $urlGenerator,
TokenGeneratorInterface $tokenGenerator
)
{
$this->router = $router;
$this->session = $session;
$this->userOAuthRepository = $userOAuthRepository;
$this->urlGenerator = $urlGenerator;
$this->tokenGenerator = $tokenGenerator;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [
FOSUserEvents::REGISTRATION_SUCCESS => [['onRegistrationSuccess', 10]],
FOSUserEvents::REGISTRATION_CONFIRM => 'onRegistrationConfirm',
];
}
public function onRegistrationSuccess(FormEvent $event): void
{
$oauthData = $this->session->get(OAuthSession::PENDING_REGISTRATION_KEY);
if (!$oauthData) {
return;
}
/** @var UserInterface $user */
$user = $event->getForm()->getData();
if ($user->getEmail() !== $oauthData['email']) {
return;
}
$newToken = $this->tokenGenerator->generateToken();
$user->setConfirmationToken($newToken);
$event->stopPropagation();
$this->session->remove(OAuthSession::PENDING_REGISTRATION_KEY);
$userOAuth = new UserOAuthEntity($user, $oauthData['provider'], $oauthData['externalId']);
$this->userOAuthRepository->save($userOAuth);
$event->setResponse(new RedirectResponse($this->urlGenerator->generate('fos_user_registration_confirm', ['token' => $user->getConfirmationToken()], UrlGeneratorInterface::ABSOLUTE_URL)));
}
public function onRegistrationConfirm(GetResponseUserEvent $event): void
{
$event->setResponse(new RedirectResponse($this->router->generate('dashboard_index')));
}
}