<?php
namespace App\EventSubscriber;
use App\Entity\Account;
use App\Entity\AccountOrganization;
use App\Repository\PermissionRepository;
use DateInterval;
use DateTime;
use DateTimeImmutable;
use Exception;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class LoadPermissionSubscriber implements EventSubscriberInterface
{
private string $validityIntervalValue;
private PermissionRepository $permissionRepository;
public function __construct(
string $validityIntervalValue,
PermissionRepository $permissionRepository,
) {
$this->validityIntervalValue = $validityIntervalValue;
$this->permissionRepository = $permissionRepository;
}
public static function getSubscribedEvents():array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
/**
* @throws Exception
*/
public function onKernelController(ControllerEvent $event):void
{
$session = $event->getRequest()->getSession();
$user = $session->get('User');
// S'il y a un utilisateur authentifié
if ($user) {
$validity = $session->get('PermissionValidity');
if ($validity === null || $validity < new DateTimeImmutable()) {
// Défini la validité des permissions en session
$session->set('PermissionValidity',
(new DateTime())->add(new DateInterval($this->validityIntervalValue)));
$permissions = [];
// Récupère les permissions en fonction de l'utilisateur
if (in_array('ROLE_ADMIN', $user->getRoles(), true)) {
$permissions = $this->permissionRepository->findAllNames();
} elseif ($user instanceof Account || $user instanceof AccountOrganization) {
$permissions = $this->permissionRepository->findByAccount($user);
}
// Défini les permissions en session
$session->set('Permission', $permissions);
}
}
}
}