<?php
namespace App\Listener;
use App\Entity\User;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class DtvRequestListener
{
private RouterInterface $router;
private TokenStorageInterface $tokenStorage;
/**
* @param RouterInterface $router
* @param TokenStorageInterface $tokenStorage
*/
public function __construct( RouterInterface $router, TokenStorageInterface $tokenStorage )
{
$this->router = $router;
$this->tokenStorage = $tokenStorage;
}
/**
* @param RequestEvent $event
*
* @return void
*/
public function onKernelRequest( RequestEvent $event ): void
{
$currentRoute = $event->getRequest()->get( '_route' );
if ( str_contains( $currentRoute, 'dtv_back_platform' ) ) {
$session = $event->getRequest()->getSession();
$project = $session->get( 'project' );
$safeRoute = [
'dtv_back_platform_project_list',
'dtv_back_platform_users',
'dtv_back_platform_settings_delete',
'app_login',
'dtv_back_platform_project_log_show',
'dtv_back_platform_project_cache_clear',
'dtv_back_platform_project_catalogue_renew',
'dtv_back_platform_project_log_clear',
];
$routeOk = array_filter( $safeRoute, static function ( $v ) use ( $currentRoute ) {
return str_contains( $currentRoute, $v );
} );
// redirection si pas de project sélectionné
if ( $project === NULL && count( $routeOk ) === 0 ) {
$url = $this->router->generate( 'dtv_back_platform_project_list' );
$response = new RedirectResponse( $url );
$event->setResponse( $response );
}
// redirection si viewOnly, que le user n'est pas dev et qu'il a une requete sur les pages de design et de contenu
if ( !is_null( $this->tokenStorage->getToken() ) ) {
/** @var User $user */
$user = $this->tokenStorage->getToken()->getUser();
// dtv_back_platform_content
// dtv_back_platform_design
if ( $project !== NULL &&
$project->isViewOnly() &&
!$user->isDeveloper() &&
( str_contains( $currentRoute, 'dtv_back_platform_design' ) or str_contains( $currentRoute, 'dtv_back_platform_content' ) )
) {
$url = $this->router->generate( 'dtv_back_platform_project_list' );
$response = new RedirectResponse( $url );
$event->setResponse( $response );
}
}
}
}
}