<?php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Service\ConfigService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
/**
* Bloque l'accès direct (URL tapée à la main) aux routes des modules
* désactivés pour l'entreprise du client connecté.
*/
class ModuleAccessSubscriber implements EventSubscriberInterface
{
// L'ordre compte : client_tv_teamplay doit être testé avant client_tv
private const ROUTE_FLAGS = [
'client_tv_teamplay' => 'displayChallenge',
'client_tv' => 'displayVideo',
'client_live_reservation' => 'displayActivity',
'client_live_mybooking' => 'displayPlanning',
'client_partner' => 'displayService',
];
private $security;
private $configService;
private $router;
public function __construct(Security $security, ConfigService $configService, UrlGeneratorInterface $router)
{
$this->security = $security;
$this->configService = $configService;
$this->router = $router;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$route = (string) $event->getRequest()->attributes->get('_route');
$flag = null;
foreach (self::ROUTE_FLAGS as $prefix => $routeFlag) {
if (strpos($route, $prefix) === 0) {
$flag = $routeFlag;
break;
}
}
if (!$flag) {
return;
}
$user = $this->security->getUser();
if (!$user instanceof User || !$user->getClient() || !$user->getClient()->getCompany()) {
return;
}
$menuConfig = $this->configService->getMenuConfigForCompany($user->getClient()->getCompany());
if (empty($menuConfig[$flag])) {
$event->setResponse(new RedirectResponse($this->router->generate('client_dashboard')));
}
}
}