Przeglądaj źródła

refactor the datetime filters supension logic

Olivier Massot 2 lat temu
rodzic
commit
1ce47cbce2

+ 4 - 0
src/Filter/Doctrine/TimeConstraint/AbstractTimeFilter.php

@@ -46,6 +46,10 @@ abstract class AbstractTimeFilter extends SQLFilter
         $this->disabled = $disabled;
     }
 
+    public function isDisabled(): bool {
+        return $this->disabled;
+    }
+
     public function setAccessId(int $accessId): void {
         $this->accessId = $accessId;
     }

+ 8 - 5
src/Repository/Access/AccessRepository.php

@@ -14,6 +14,7 @@ use Doctrine\Persistence\ManagerRegistry;
 use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
 use Symfony\Component\HttpFoundation\RequestStack;
 use Symfony\Component\Security\Core\User\UserInterface;
+use App\Service\Doctrine\FiltersConfigurationService;
 
 /**
  * @method Access|null find($id, $lockMode = null, $lockVersion = null)
@@ -26,7 +27,11 @@ class AccessRepository extends ServiceEntityRepository implements UserLoaderInte
     const ACCESS_NAME_HEADER = 'X-AccessId';
     const HTTP_X_SWITCH_USER = 'X-Switch-User';
 
-    public function __construct(ManagerRegistry $registry, private RequestStack $requestStack)
+    public function __construct(
+        ManagerRegistry $registry,
+        private RequestStack $requestStack,
+        private FiltersConfigurationService $filtersConfigurationService
+    )
     {
         parent::__construct($registry, Access::class);
     }
@@ -147,9 +152,7 @@ class AccessRepository extends ServiceEntityRepository implements UserLoaderInte
         if ($date === null)
             $date = new DateTime();
 
-        /** @var DatetimeFilter $filter */
-        $filter = $this->_em->getFilters()->getFilter('date_time_filter');
-        $filter->setDisabled(true);
+        $this->filtersConfigurationService->suspendTimeConstraintFilters();
 
         $qb = $this->createQueryBuilder('access');
         $qb
@@ -164,7 +167,7 @@ class AccessRepository extends ServiceEntityRepository implements UserLoaderInte
 
         $result = $qb->getQuery()->getResult();
 
-        $filter->setDisabled(false);
+        $this->filtersConfigurationService->restoreTimeConstraintFilters();
 
         return $result;
     }

+ 60 - 0
src/Service/Doctrine/FiltersConfigurationService.php

@@ -19,6 +19,15 @@ use Doctrine\ORM\Query\FilterCollection;
  */
 class FiltersConfigurationService
 {
+    /**
+     * L'état du des filtres de contrainte de temps avant l'utilisation de la méthode suspendTimeConstraintFilters()
+     * Si $previousTimeConstraintState est `true`, les filtres étaient activés, et si c'est `false`, les filtres
+     * étaient désactivés. Si les filtres ne sont pas suspendus, $previousTimeConstraintState est null.
+     *
+     * @var bool|null
+     */
+    private ?bool $previousTimeConstraintState = null;
+
     public function __construct(
         private EntityManagerInterface $entityManager,
         private DateTimeConstraint $dateTimeConstraint,
@@ -50,4 +59,55 @@ class FiltersConfigurationService
         $activityYearFilter->setAccessId($accessId);
         $activityYearFilter->setTimeConstraint($this->activityYearConstraint);
     }
+
+    /**
+     * Suspends les contraintes de temps. Celles-ci pourront être restorées grâce à la méthode
+     * restoreTimeConstraintFilters().
+     *
+     * @see src/Filter/Doctrine/TimeConstraint/AbstractTimeFilter.php
+     *
+     * @return void
+     */
+    public function suspendTimeConstraintFilters(): void {
+        if ($this->previousTimeConstraintState !== null) {
+            throw new \RuntimeException("date_time_filter is already suspended");
+        }
+
+        $filters = $this->entityManager->getFilters();
+
+        if (!$filters->isEnabled('date_time_filter')) {
+            $this->previousTimeConstraintState = false;
+            return;
+        }
+
+        /** @var AbstractTimeFilter $filter */
+        $filter = $filters->getFilter('date_time_filter');
+
+        $this->previousTimeConstraintState = $filter->isDisabled() === false;
+        $filter->setDisabled(true);
+    }
+
+    /**
+     * Restore les contraintes de temps après qu'elles aient été suspendues au moyen de la
+     * méthode suspendTimeConstraintFilters()
+     *
+     * @see src/Filter/Doctrine/TimeConstraint/AbstractTimeFilter.php
+     *
+     * @return void
+     */
+    public function restoreTimeConstraintFilters(): void {
+        if ($this->previousTimeConstraintState === null) {
+            throw new \RuntimeException("date_time_filter has not been suspended, can not be restored");
+        }
+
+        $filters = $this->entityManager->getFilters();
+
+        if ($filters->isEnabled('date_time_filter')) {
+            /** @var AbstractTimeFilter $filter */
+            $filter = $filters->getFilter('date_time_filter');
+            $filter->setDisabled($this->previousTimeConstraintState);
+        }
+
+        $this->previousTimeConstraintState = null;
+    }
 }