<?php
namespace App\EventSubscriber;
use ApiPlatform\Symfony\EventListener\EventPriorities;
use App\Entity\Document;
use App\Entity\Site;
use App\Evaluation\EvaluationPrepare;
use App\Repository\SiteRepository;
use App\Services\SiteService;
use App\Command\PropagateSiteAccessCommand;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Security;
use Psr\Log\LoggerInterface;
final class SiteSubscriber implements EventSubscriberInterface
{
public function __construct(
private EvaluationPrepare $evaluationPrepare,
private Security $security,
private readonly ParameterBagInterface $parameterBag,
private SiteService $siteService,
private PropagateSiteAccessCommand $propagateSiteAccessCommand,
private SiteRepository $siteRepository
)
{
$this->security = $security;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['prepareSite', EventPriorities::POST_WRITE],
];
}
public function prepareSite(ViewEvent $event): void
{
$method = $event->getRequest()->getMethod();
$site = $event->getControllerResult();
if (!$site instanceof Site) {
return;
}
try {
if ($method === 'POST') {
$customer = $site->getCustomer()->getId();
if ($customer === 355) {
$sitePath = $site->getPath();
if (isset($sitePath[2]) && $sitePath[2] === 'DIL') {
$siteToProcess = $this->siteRepository->findOneByCode($sitePath[1]);
$siteToProcessId = $siteToProcess ? $siteToProcess->getId() : null;
$this->propagateSiteAccessCommand->propagate($siteToProcessId);
}
elseif (isset($sitePath[2]) && substr($sitePath[2], 0, 3) === 'GMR') {
$parentSiteToProcess = $this->siteRepository->findOneByCode($sitePath[2]);
$siteToProcess = $this->siteRepository->findOneByCode($sitePath[1]);
$siteToProcessId = $siteToProcess ? $siteToProcess->getId() : null;
$parentSiteToProcessId = $parentSiteToProcess ? $parentSiteToProcess->getId() : null;
$this->propagateSiteAccessCommand->propagate($parentSiteToProcessId);
$this->propagateSiteAccessCommand->propagate($siteToProcessId);
}
}
} elseif ($method === 'PUT') {
$paramsArray = json_decode($event->getRequest()->getContent(), true);
$docsIds = $paramsArray['docsIds'] ?? false;
$idUser = $paramsArray['idUser'] ?? false;
if($docsIds) {
$this->siteService->siteAffectationDoc($site, $docsIds, $idUser);
}
}
} catch (\Throwable $throwable) {
header('Access-Control-Allow-Origin: *');
dd($throwable->getMessage());
}
}
}