<?php
namespace App\EventSubscriber;
use App\Entity\WebList;
use App\Entity\Selection;
use App\Entity\WebFilter;
use App\Service\ProductApi;
use App\Entity\EditionsPlanner;
use App\Service\FilterCalculationService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use ApiPlatform\Core\EventListener\EventPriorities;
use ApiPlatform\Core\Util\RequestAttributesExtractor;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
final class CalculateFilterResultsSubscriber implements EventSubscriberInterface
{
/**
* @var EntityManagerInterface
*/
protected $em;
/**
* @var ProductApi
*/
protected $productApi;
/**
* @var FilterCalculationService
*/
protected $filterCalculationService;
public function __construct(EntityManagerInterface $em, ProductApi $productApi, FilterCalculationService $filterCalculationService)
{
$this->em = $em;
$this->productApi = $productApi;
$this->filterCalculationService = $filterCalculationService; // new FilterCalculationService($em, $productApi);
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => ['postPersist', EventPriorities::POST_WRITE],
];
}
public function postPersist(ViewEvent $event): void
{
$object = $event->getControllerResult();
$request = $event->getRequest();
if(!$object instanceof WebList && !$object instanceof Selection && !$object instanceof WebFilter) {
return;
}
if(!in_array($request->getMethod(), [Request::METHOD_POST, Request::METHOD_PUT])){
return;
}
$attributes = RequestAttributesExtractor::extractAttributes($request);
// ND 24/07/2024 : maintenant que le code de calcul des filtres est optimisé, on fait les traitements directement à l'enregistrement - fini les tâches de fond
switch ($attributes['resource_class'])
{
case WebList::class:
$selectionId = $object->getSelection()->getId();
$this->filterCalculationService->deleteResultsForSelection($selectionId);
$this->filterCalculationService->calculateSelection($selectionId);
break;
case Selection::class:
$selectionId = $object->getId();
$this->filterCalculationService->deleteResultsForSelection($selectionId);
$this->filterCalculationService->calculateSelection($selectionId);
break;
case WebFilter::class:
$filterId = $object->getId();
$this->filterCalculationService->deleteResultsForFilter($filterId);
$this->filterCalculationService->calculateFilterOnAllWebSelection($filterId);
break;
default:
return;
}
return;
/*
// on choppe toutes les taches edition planner de type FilterCalculationService en attente -> si y'en a on return
$tasks = $this->em->getRepository(EditionsPlanner::class)->findBy(['serviceName' => '\App\Service\FilterCalculationService', 'state' => 0]);
// On vérifie si une tâche similaire est déjà en attente
if(count($tasks) > 0) {
foreach($tasks as $task) {
$param = unserialize($task->getParams());
if(isset($param['selection']) && $object instanceof Selection && $param['selection'] == $object->getId()) {
return;
}
if(isset($param['selection']) && $object instanceof WebList && $param['selection'] == $object->getSelection()->getId()) {
return;
}
if(isset($param['filter']) && $object instanceof WebFilter && $param['filter'] == $object->getId()) {
return;
}
}
}
$attributes = RequestAttributesExtractor::extractAttributes($request);
$task = new EditionsPlanner();
$task->setServiceName('\App\Service\FilterCalculationService');
$task->setLog('En attente');
$task->setState(0);
$task->setCreatedAt(new \DateTime());
$task->setProcessedAt(null);
$taskParams = array();
$tmpName = 'selection';
switch ($attributes['resource_class'])
{
case WebList::class:
$taskParams['selection'] = $object->getSelection()->getId();
break;
case Selection::class:
$taskParams['selection'] = $object->getId();
break;
case WebFilter::class:
$taskParams['filter'] = $object->getId();
$tmpName = 'filter';
break;
default:
return;
}
$task->setParams(serialize($taskParams));
$task->setName("calcul_web_" . $tmpName . "_" . (new \DateTime())->format('YmdHis'));
$this->em->persist($task);
$this->em->flush();
*/
}
}