<?php
namespace App\EventListener;
use App\EventListener\FilterControllerEvent;
use App\EventListener\Router;
use App\EventListener\TokenStorage;
use App\Controller\Front\UserController;
use App\Controller\ResettingController;
use App\Controller\SecurityController;
use App\Entity\User;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class ControllerListener
{
/** @var null TokenStorage */
protected $tokenStorage;
/** @var null RouterInterface */
protected $router;
private $authorizationChecker;
/**
* ControllerListener constructor.
*
* @param TokenStorage $tokenStorage
* @param Router $router
*/
public function __construct(TokenStorageInterface $tokenStorage, RouterInterface $router, $authorizationChecker)
{
$this->tokenStorage = $tokenStorage;
$this->router = $router;
$this->authorizationChecker = $authorizationChecker;
}
/**
* @param FilterControllerEvent $event
*/
public function onCoreController(ControllerEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$controller = $event->getController();
if (! is_array($controller)) {
return;
}
$controller = $controller[0];
$excludedControllers = [
'App\Controller\Admin\\',
SecurityController::class,
ResettingController::class,
\FOS\UserBundle\Controller\ResettingController::class,
'FOS\JsRoutingBundle\Controller\\',
'Symfony\\',
];
if ($event->getRequest()->get('_route') === 'malys_front_user_cgs_accept') {
$excludedControllers[] = UserController::class;
}
$controllerClass = get_class($controller);
foreach ($excludedControllers as $excludedController) {
if (strpos($controllerClass, $excludedController) !== false || $excludedController === $controllerClass) {
return;
}
}
if ($this->tokenStorage->getToken() == null) {
return;
}
/** @var User $user */
$user = $this->tokenStorage->getToken()->getUser();
// If user is not logged
if (! $user instanceof User) {
return;
}
// If this is an admin impersonating a customer, we bypass CGS agreement
if ($this->authorizationChecker->isGranted('ROLE_PREVIOUS_ADMIN')) {
return;
}
if (! $user->getCgs() || empty($user->getCgs())) {
$route = 'malys_front_user_cgs_accept';
if ($route !== $event->getRequest()->get('_route')) {
$url = $this->router->generate($route);
$event->setController(
function () use ($url) {
return new RedirectResponse($url);
}
);
return;
}
}
}
/**
* @return array<string, mixed>
*/
public static function getSubscribedEvents(): array
{
return [KernelEvents::CONTROLLER => 'onCoreController'];
}
}