<?php
namespace App\EventSubscriber;
use App\Repository\LotsRepository;
use App\Repository\ProgrammeRepository;
use App\Repository\UserRepository;
use App\Service\ProgramService;
use JetBrains\PhpStorm\NoReturn;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Class JWTCreatedListener
*
* @package \App\EventSubscriber
*/
class JWTCreatedListener
{
/**
* @var RequestStack
*/
private $security;
/**
* @var ProgrammeRepository
*/
private $prgRepo;
/**
* @var LotsRepository
*/
private $lotRepo;
/**
* @var ProgramService
*/
private $programService;
/**
* @var UserRepository
*/
private UserRepository $userRepository;
/**
* JWTCreatedListener constructor.
*
* @param \Symfony\Component\Security\Core\Security $security
* @param \App\Repository\ProgrammeRepository $prgRepo
* @param UserRepository $userRepository
* @param ProgramService $programService
* @param LotsRepository $lotsRepository
*/
public function __construct(Security $security,
ProgrammeRepository $prgRepo,
UserRepository $userRepository,
ProgramService $programService,
LotsRepository $lotsRepository)
{
$this->security = $security;
$this->prgRepo = $prgRepo;
$this->userRepository = $userRepository;
$this->programService = $programService;
$this->lotRepo = $lotsRepository;
}
/**
* @param JWTCreatedEvent $event
* @throws \Exception
*/
#[NoReturn] public
function onJWTCreated(JWTCreatedEvent $event)
{
$user = $event->getUser();
if (!$user instanceof UserInterface) {
return;
}
$userEntity = $this->userRepository->findOneBy(['username' => $user->getUsername()]);
$userId = $userEntity->getId();
$userRoles = $userEntity->getRoles();
$payload = $event->getData();
$programme = [];
if (!in_array('ROLE_ADMIN', $userRoles)) {
if (in_array('ROLE_PROMOTEUR', $userRoles) || in_array('ROLE_PROMOTEUR_CONSULT', $userRoles)) {
$programme = $this->security->getUser()->getProgrammes()->last();
if (false === $programme) {
throw new \Exception('Compte invalide merci de contacter l\'administrateur');
}
} elseif (in_array('ROLE_CONTACT', $userRoles)) {
if (empty($programme)) {
$lots = $this->security->getUser()->getLots()->last();
$programme = $lots ? $lots->getProgramme() : null;
}
if (false === $programme) {
throw new \Exception('Compte invalide merci de contacter l\'administrateur');
}
}
if ($programme) {
$payload['programme'] = $programme->getName();
$payload['programmeId'] = $programme->getId();
}
}
$payload['id'] = $userId;
$event->setData($payload);
}
}