<?php
namespace App\EventSubscriber;
use App\Entity\UserInterface;
use App\Event\ObjectEvent;
use App\Events;
use App\Message\InvitationProcess;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Messenger\MessageBusInterface;
/**
* Process user invitation.
*/
class InvitationSubscriber implements EventSubscriberInterface
{
public const SESSION_NAME = 'app_invite_data';
/** @var RequestStack */
private $requestStack;
/** @var MessageBusInterface */
private $messageBus;
/**
* @param RequestStack $requestStack
* @param MessageBusInterface $messageBus
*/
public function __construct(RequestStack $requestStack, MessageBusInterface $messageBus)
{
$this->requestStack = $requestStack;
$this->messageBus = $messageBus;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array
{
return [
Events::USER_CREATED => 'onUserCreated',
Events::USER_INVITED => 'onUserInvited',
];
}
/**
* @param ObjectEvent $event
*/
public function onUserCreated(ObjectEvent $event): void
{
$user = $event->getObject();
if ($user instanceof UserInterface) {
$this->processUser($user);
}
}
/**
* @param ObjectEvent $event
*/
public function onUserInvited(ObjectEvent $event): void
{
$user = $event->getObject();
if ($user instanceof UserInterface) {
$this->processUser($user);
}
}
/**
* @param UserInterface $user
*/
private function processUser(UserInterface $user)
{
try {
/** @var SessionInterface $session */
$session = $this->requestStack->getSession();
} catch (SessionNotFoundException $e) {
return;
}
if (!$session->has(self::SESSION_NAME)) {
return;
}
// Process invitation
if ($inviteeData = $session->get(self::SESSION_NAME)) {
if (isset($inviteeData['id']) && isset($inviteeData['objectClass'])) {
$this->messageBus->dispatch(
new InvitationProcess(
$inviteeData['id'],
[
'loginUser' => (string) $user->getId(),
'objectClass' => $inviteeData['objectClass'],
]
)
);
}
}
$session->remove(self::SESSION_NAME);
}
}