<?php
namespace App\DoctrineFilter;
use App\Security\User;
use App\V4\Security\AuthenticationManager;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\KernelEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class CustomerFilterEventSubscriber implements EventSubscriberInterface
{
/**
* @var AuthenticationManager
*/
private $authenticationManager;
/**
* @var EntityManagerInterface
*/
private $entityManager;
public function __construct(AuthenticationManager $authenticationManager, EntityManagerInterface $entityManager)
{
$this->authenticationManager = $authenticationManager;
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 7],
];
}
public function onKernelRequest(KernelEvent $event): void
{
$filters = $this->entityManager->getFilters();
$user = $this->authenticationManager->getLoggedInUser();
if (!$user instanceof User) {
return;
}
$filters
->getFilter('customer_filter')
->setParameter('customer_id', $this->getCustomerId($user, $event->getRequest()), Types::TEXT)
;
}
private function getCustomerId(User $user, Request $request): string
{
$isSuperAdmin = in_array('ROLE_SUPERADMIN', $user->getRoles(), true);
if (!$isSuperAdmin) {
return $user->getCustomerId();
}
$customerId = $request->query->get('customer_id');
if (null !== $customerId) {
return $customerId;
}
$customerId = $request->query->get('customerId');
if (null !== $customerId) {
return $customerId;
}
$requestContent = json_decode($request->getContent(), true);
if (is_array($requestContent)) {
if (isset($requestContent['customer_id'])) {
return $requestContent['customer_id'];
}
if (isset($requestContent['customerId'])) {
return $requestContent['customerId'];
}
}
return $user->getCustomerId();
}
}