<?php
declare(strict_types=1);
namespace App\Tuer24\EventSubscriber;
use App\Tuer24\ApiResource\Tuer24Article;
use App\Tuer24\ApiResource\Tuer24DistributorRequest;
use App\Tuer24\Controller\Tuer24DistributorOrderController;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* Disables the UserAware SQL filter for specific controllers.
*
* This subscriber runs before EasyAdmin's AdminRouterSubscriber (priority -1)
* to ensure the filter is disabled before entity fetching occurs.
*
* Required for distributors to view orders from other users.
*/
class DisableUserAwareFilterSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $em;
/**
* Controllers that should bypass the UserAware filter
*/
private const BYPASS_CONTROLLERS = [
Tuer24DistributorOrderController::class,
];
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public static function getSubscribedEvents(): array
{
return [
// Run AFTER UserDetection (priority 5/PRE_READ) but BEFORE EasyAdmin's AdminRouterSubscriber (priority -1)
// UserDetection enables the filter, we need to disable it after that
KernelEvents::REQUEST => ['onKernelRequest', 1],
];
}
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();
// Check if this is an EasyAdmin request with a controller we want to bypass
if ($this->isDisabled($request)) {
$filters = $this->em->getFilters();
if ($filters->isEnabled('user_aware_filter')) {
$filters->disable('user_aware_filter');
}
}
}
private function isDisabled(Request $request): bool
{
$disable = false;
if($request->query->has('crudControllerFqcn')){
$disable = in_array($request->query->get('crudControllerFqcn'), self::BYPASS_CONTROLLERS, true);
}
if($request->attributes->has('_api_resource_class') && !$disable) {
$disable = in_array($request->attributes->get('_api_resource_class'), [Tuer24Article::class, Tuer24DistributorRequest::class], true);
}
return $disable;
}
}