<?php
namespace App\EventListener;
use App\Entity\Gos\PortalSettings;
use App\Entity\Gos\User;
use App\Utils\PortalSettingsService;
use App\Utils\SalesManago\SalesManagoEvent;
use App\Utils\SalesManago\v2\Action\Contact\Upsert\Events\SalesManagoUpsertEventsV2;
use App\Utils\SalesManago\v2\Action\SalesManagoEventDispatcher;
use Doctrine\ORM\EntityManagerInterface;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\FOSUserEvents;
use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
use Lexik\Bundle\JWTAuthenticationBundle\Events as JWTAuthenticationEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
class SalesManagoListener implements EventSubscriberInterface
{
public const ROUTES = ['uniqskills_login_check', 'uniqskills_otp_login', 'uniqskills_register', 'eforum_login_check', 'eforum_otp_login', 'eforum_register'];
private $salesManagoUtils;
private $salesManagoEventDispatcher;
private $em;
private $portalSettingsService;
private $requestStack;
public function __construct(
EntityManagerInterface $em,
SalesManagoEvent $salesManagoUtils,
SalesManagoEventDispatcher $salesManagoEventDispatcher,
PortalSettingsService $portalSettingsService,
RequestStack $requestStack
) {
$this->salesManagoUtils = $salesManagoUtils;
$this->salesManagoEventDispatcher = $salesManagoEventDispatcher;
$this->em = $em;
$this->portalSettingsService = $portalSettingsService;
$this->requestStack = $requestStack;
}
public static function getSubscribedEvents(): array
{
return [
FOSUserEvents::REGISTRATION_COMPLETED => ['onRegistrationCompleted', -1],
SecurityEvents::INTERACTIVE_LOGIN => ['onSecurityInteractiveLogin', -1],
JWTAuthenticationEvents::AUTHENTICATION_SUCCESS => 'onAuthenticationSuccessResponse',
KernelEvents::RESPONSE => 'onKernelResponse'
];
}
public function onRegistrationCompleted(FilterUserResponseEvent $event)
{
$user = $event->getUser();
$request = $event->getRequest();
$portalSettings = $this->em->getRepository(PortalSettings::class)
->findOneByHash($this->portalSettingsService->getPortalSettingsHash($request));
$request->getSession()->set('salesManagoContactId', $this->salesManagoUtils->getSalesManagoContactId($user));
$this->salesManagoEventDispatcher->dispatchContactUpsert($user, SalesManagoUpsertEventsV2::ON_REGISTRATION, $portalSettings);
}
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$user = $event->getAuthenticationToken()->getUser();
$request = $event->getRequest();
$request->getSession()->set('salesManagoContactId', $this->salesManagoUtils->getSalesManagoContactId($user));
//No handling for api authentication context, don't confuse with api_login, check security.yaml
if ($request->attributes->get('_firewall_context', '') !== 'security.firewall.map.context.api') {
$portalSettings = $this->em->getRepository(PortalSettings::class)
->findOneByHash($this->portalSettingsService->getPortalSettingsHash($request));
if ($portalSettings) {
$this->salesManagoEventDispatcher->dispatchLoginEvent($user, $portalSettings);
}
}
}
public function onAuthenticationSuccessResponse(AuthenticationSuccessEvent $event)
{
$data = $event->getData();
$user = $event->getUser();
if (!$user instanceof User) {
return;
}
$data['salesManagoContactId'] = $this->salesManagoUtils->getSalesManagoContactId($user);
$event->setData($data);
}
public function onKernelResponse(ResponseEvent $event)
{
$request = $event->getRequest();
$response = $event->getResponse();
if (!in_array($request->attributes->get('_route'), self::ROUTES))
{
return;
}
$salesManagoContactId = $request->getSession()->get('salesManagoContactId');
if (!$request->cookies->has('smclient') && $salesManagoContactId)
{
$response->headers->setCookie(
Cookie::create(
'smclient',
$salesManagoContactId,
strtotime('now + 10 years'),
'/',
null,
false,
false
)
);
}
$event->setResponse($response);
}
}