Bläddra i källkod

refactor the entity dataPersisters and onChange classes

Olivier Massot 3 år sedan
förälder
incheckning
e579bc7b97

+ 8 - 2
src/DataPersister/BaseDataPersister.php → src/DataPersister/EntityDataPersister.php

@@ -6,14 +6,13 @@ use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
 use App\Service\OnChange\Organization\OnChangeContext;
 use App\Service\OnChange\Organization\OnChangeDefault;
 use App\Service\OnChange\Organization\OnChangeInterface;
-use Doctrine\ORM\EntityManagerInterface;
 use Symfony\Contracts\Service\Attribute\Required;
 
 /**
  * Classe de base pour les DataPersister classiques, proposant des hook pre et post persist,
  * ainsi que certaines méthodes liées au contexte de la mise à jour.
  */
-class BaseDataPersister implements ContextAwareDataPersisterInterface
+class EntityDataPersister implements ContextAwareDataPersisterInterface
 {
     // <-- dependencies injections
     protected ContextAwareDataPersisterInterface $contextAwareDataPersister;
@@ -34,6 +33,13 @@ class BaseDataPersister implements ContextAwareDataPersisterInterface
         return false;
     }
 
+    /**
+     * Persist l'entité et déclenche les différents hooks de la classe OnChangeInterface définie par le data persister
+     *
+     * @param mixed $data
+     * @param array $context
+     * @return object|void
+     */
     public function persist($data, array $context = [])
     {
         $onChangeContext = new OnChangeContext($context);

+ 6 - 18
src/DataPersister/Organization/OrganizationDataPersister.php

@@ -3,39 +3,27 @@ declare(strict_types=1);
 
 namespace App\DataPersister\Organization;
 
-use App\DataPersister\BaseDataPersister;
+use App\DataPersister\EntityDataPersister;
 use App\Entity\Organization\Organization;
 use App\Service\OnChange\Organization\OnOrganizationChange;
 use Exception;
+use JetBrains\PhpStorm\Pure;
 
 /**
  * Classe OrganizationDataPersister qui est un custom dataPersister gérant la resource Organization
  */
-class OrganizationDataPersister extends BaseDataPersister
+class OrganizationDataPersister extends EntityDataPersister
 {
+    #[Pure]
     public function __construct(
-        private OnOrganizationChange $onOrganizationChange
+        OnOrganizationChange $onChange
     )
     {
+        parent::__construct($onChange);
     }
 
     public function supports($data, array $context = []): bool
     {
         return $data instanceof Organization;
     }
-
-    /**
-     * @param Organization $organization
-     */
-    public function prePersist($organization): void{
-        if($this->previousData() && $this->previousData()->getLegalStatus() !== $organization->getLegalStatus()){
-            $this->onOrganizationChange->onLegalStatusChange($organization);
-        }
-    }
-
-    public function remove($data, array $context = []): void
-    {
-        throw new Exception('not supported', 500);
-    }
-
 }

+ 8 - 97
src/DataPersister/Organization/ParametersDataPersister.php

@@ -3,115 +3,26 @@ declare(strict_types=1);
 
 namespace App\DataPersister\Organization;
 
-use App\DataPersister\BaseDataPersister;
+use App\DataPersister\EntityDataPersister;
 use App\Entity\Organization\Parameters;
-use App\Message\Command\Parameters\AverageChange;
-use App\Message\Command\Typo3\Typo3DeleteCommand;
-use App\Message\Command\Typo3\Typo3UndeleteCommand;
-use App\Message\Command\Typo3\Typo3UpdateCommand;
 use App\Service\OnChange\Organization\OnParametersChange;
-use Exception;
-use Symfony\Component\Messenger\MessageBusInterface;
+use JetBrains\PhpStorm\Pure;
 
 /**
  * Classe ParametersDataPersister qui est un custom dataPersister gérant la resource Parameters
  */
-class ParametersDataPersister extends BaseDataPersister
+class ParametersDataPersister extends EntityDataPersister
 {
+    #[Pure]
     public function __construct(
-        private MessageBusInterface $messageBus,
-        private OnParametersChange $onParametersChange,
-        private \App\Service\Network\Utils $networkUtils
+        OnParametersChange $onChange
     )
-    {}
-
-    public function supports($data, array $context = []): bool
-    {
-        return $data instanceof Parameters;
-    }
-
-    protected function validate($parameters): void
     {
-        // Une structure CMF n'a pas le droit de désactiver son site typo3
-        if (
-            $parameters->getDesactivateOpentalentSiteWeb() === true &&
-            $this->networkUtils->isCMFAndActiveNow($parameters->getOrganization())
-        ) {
-            throw new \RuntimeException('This structure is currently active in the CMF network, the website can not be disabled.');
-        }
+        parent::__construct($onChange);
     }
 
-    /**
-     * @param Parameters $parameters
-     * @throws Exception
-     */
-    public function prePersist($parameters): void{
-        if(
-            $this->previousData() &&
-            $this->previousData()->getAdvancedEducationNotationType() !== $parameters->getAdvancedEducationNotationType()
-        ){
-            $this->onParametersChange->onAdvancedEducationNotationTypeChange($parameters);
-        }
-
-        //La date de début d'activité change
-        if(
-            $this->previousData() &&
-            $this->previousData()->getMusicalDate() != $parameters->getMusicalDate()
-        ){
-            $this->onParametersChange->onMusicalDateChange(
-                $parameters->getOrganization(),
-                $this->previousData()->getMusicalDate()
-            );
-        }
-    }
-
-    /**
-     * @param Parameters $parameters
-     */
-    public function postPersist($parameters): void{
-        //La note maximale du suivi pédagogique change
-        if(
-            $this->previousData() &&
-            $this->previousData()->getAverage() !== $parameters->getAverage()
-        ){
-            $this->messageBus->dispatch(
-                new AverageChange($parameters->getId())
-            );
-        }
-
-        // Le customDomain a été modifié, on met à jour le site typo3 (s'il est actif)
-        if(
-            $this->previousData() &&
-            !$parameters->getDesactivateOpentalentSiteWeb() &&
-            $this->previousData()->getCustomDomain() !== $parameters->getCustomDomain()
-        ){
-            $this->messageBus->dispatch(
-                new Typo3UpdateCommand($parameters->getOrganization()->getId())
-            );
-        }
-
-        // Le site web opentalent a été désactivé / réactivé
-        if(
-            $this->previousData() &&
-            $this->previousData()->getDesactivateOpentalentSiteWeb() !== $parameters->getDesactivateOpentalentSiteWeb()
-        ){
-            if ($parameters->getDesactivateOpentalentSiteWeb()) {
-                $this->messageBus->dispatch(
-                    new Typo3DeleteCommand($parameters->getOrganization()->getId())
-                );
-            } else {
-                $this->messageBus->dispatch(
-                    new Typo3UndeleteCommand($parameters->getOrganization()->getId())
-                );
-                $this->messageBus->dispatch(
-                    new Typo3UpdateCommand($parameters->getOrganization()->getId())
-                );
-            }
-        }
-    }
-
-    public function remove($data, array $context = []): void
+    public function supports($data, array $context = []): bool
     {
-        throw new Exception('not supported', 500);
+        return $data instanceof Parameters;
     }
 }

+ 4 - 10
src/DataPersister/Organization/SubdomainDataPersister.php

@@ -3,15 +3,17 @@ declare(strict_types=1);
 
 namespace App\DataPersister\Organization;
 
-use App\DataPersister\BaseDataPersister;
+use App\DataPersister\EntityDataPersister;
 use App\Entity\Organization\Subdomain;
 use App\Service\OnChange\Organization\OnSubdomainChange;
+use JetBrains\PhpStorm\Pure;
 
 /**
  * Ccustom dataPersister gérant la resource Subdomain
  */
-class SubdomainDataPersister extends BaseDataPersister
+class SubdomainDataPersister extends EntityDataPersister
 {
+    #[Pure]
     public function __construct(
         OnSubdomainChange $onChange
     ) {
@@ -22,12 +24,4 @@ class SubdomainDataPersister extends BaseDataPersister
     {
         return $data instanceof Subdomain;
     }
-
-    /**
-     * @param Subdomain $subdomain
-     */
-    protected function postPersist($subdomain): void
-    {
-
-    }
 }

+ 9 - 2
src/Service/OnChange/Organization/OnOrganizationChange.php

@@ -10,8 +10,15 @@ use App\Test\Service\OnChange\Organization\OnOrganizationChangeTest;
 /**
  * Classe OnOrganizationChange qui comporte toutes les opérations automatiquent se produisant lors de l'évolution d'une organisation
  */
-class OnOrganizationChange
+class OnOrganizationChange extends OnChangeDefault
 {
+    public function beforeChange($organization, OnChangeContext $context): void
+    {
+        if($context->previousData() && $context->previousData()->getLegalStatus() !== $organization->getLegalStatus()){
+            $this->onLegalStatusChange($organization);
+        }
+    }
+
     /**
      * Si le statut de l'organization évolue, on doit faire évoluer d'autre paramètres.
      * @param Organization $organization
@@ -26,4 +33,4 @@ class OnOrganizationChange
             $organization->getBillingSetting()->setApplyVat(true);
         }
     }
-}
+}

+ 89 - 3
src/Service/OnChange/Organization/OnParametersChange.php

@@ -9,19 +9,105 @@ use App\Entity\Education\EducationNotationConfig;
 use App\Entity\Organization\Organization;
 use App\Entity\Organization\Parameters;
 use App\Enum\Education\AdvancedEducationNotationTypeEnum;
+use App\Message\Command\Parameters\AverageChange;
+use App\Message\Command\Typo3\Typo3DeleteCommand;
+use App\Message\Command\Typo3\Typo3UndeleteCommand;
+use App\Message\Command\Typo3\Typo3UpdateCommand;
 use App\Repository\Booking\CourseRepository;
 use App\Test\Service\OnChange\Organization\OnParametersChangeTest;
 use App\Service\Organization\Utils as organizationUtils;
+use Symfony\Component\Messenger\MessageBusInterface;
 
 /**
  * Classe OnParametersChange qui comporte toutes les opérations automatiquent se produisant lors de l'évolution des paramètres
  */
-class OnParametersChange
+class OnParametersChange extends OnChangeDefault
 {
     public function __construct(
-        private CourseRepository $courseRepository
+        private CourseRepository $courseRepository,
+        private \App\Service\Network\Utils $networkUtils,
+        private MessageBusInterface $messageBus
     ){ }
 
+    public function validate($parameters, OnChangeContext $context): void
+    {
+        // Une structure CMF n'a pas le droit de désactiver son site typo3
+        if (
+            $parameters->getDesactivateOpentalentSiteWeb() === true &&
+            $this->networkUtils->isCMFAndActiveNow($parameters->getOrganization())
+        ) {
+            throw new \RuntimeException('This structure is currently active in the CMF network, the website can not be disabled.');
+        }
+    }
+
+    /**
+     * @param Parameters $parameters
+     */
+    public function prePersist($parameters, OnChangeContext $context): void{
+        if(
+            $context->previousData() &&
+            $context->previousData()->getAdvancedEducationNotationType() !== $parameters->getAdvancedEducationNotationType()
+        ){
+            $this->onAdvancedEducationNotationTypeChange($parameters);
+        }
+
+        //La date de début d'activité change
+        if(
+            $context->previousData() &&
+            $context->previousData()->getMusicalDate() !== $parameters->getMusicalDate()
+        ){
+            $this->onMusicalDateChange(
+                $parameters->getOrganization(),
+                $context->previousData()->getMusicalDate()
+            );
+        }
+    }
+
+    /**
+     * @param Parameters $parameters
+     */
+    public function postPersist($parameters, OnChangeContext $context): void{
+        //La note maximale du suivi pédagogique change
+        if(
+            $context->previousData() &&
+            $context->previousData()->getAverage() !== $parameters->getAverage()
+        ){
+            $this->messageBus->dispatch(
+                new AverageChange($parameters->getId())
+            );
+        }
+
+        // Le customDomain a été modifié, on met à jour le site typo3 (s'il est actif)
+        if(
+            $context->previousData() &&
+            !$parameters->getDesactivateOpentalentSiteWeb() &&
+            $context->previousData()->getCustomDomain() !== $parameters->getCustomDomain()
+        ){
+            $this->messageBus->dispatch(
+                new Typo3UpdateCommand($parameters->getOrganization()->getId())
+            );
+        }
+
+        // Le site web opentalent a été désactivé / réactivé
+        if(
+            $context->previousData() &&
+            $context->previousData()->getDesactivateOpentalentSiteWeb() !== $parameters->getDesactivateOpentalentSiteWeb()
+        ){
+            if ($parameters->getDesactivateOpentalentSiteWeb()) {
+                $this->messageBus->dispatch(
+                    new Typo3DeleteCommand($parameters->getOrganization()->getId())
+                );
+            } else {
+                $this->messageBus->dispatch(
+                    new Typo3UndeleteCommand($parameters->getOrganization()->getId())
+                );
+                $this->messageBus->dispatch(
+                    new Typo3UpdateCommand($parameters->getOrganization()->getId())
+                );
+            }
+        }
+    }
+
     /**
      * Si le le type de grilles d'évaluation évolue, il faut "nettoyer" les curriculums/teachers associés au type précédent
      * @param Parameters $parameters
@@ -74,4 +160,4 @@ class OnParametersChange
             $course->setEndYear($year + 1);
         }
     }
-}
+}

+ 0 - 5
src/Service/OnChange/Organization/OnSubdomainChange.php

@@ -2,15 +2,12 @@
 
 namespace App\Service\OnChange\Organization;
 
-use App\Entity\Organization\Organization;
 use App\Entity\Organization\Subdomain;
 use App\Message\Command\Typo3\Typo3UpdateCommand;
 use App\Service\MailHub;
 use App\Service\Typo3\BindFileService;
 use Doctrine\ORM\EntityManagerInterface;
-use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
 use Symfony\Component\Messenger\MessageBusInterface;
-use Symfony\Component\Security\Core\Security;
 
 class OnSubdomainChange extends OnChangeDefault
 {
@@ -18,8 +15,6 @@ class OnSubdomainChange extends OnChangeDefault
         private \App\Service\Organization\Utils $organizationUtils,
         private \App\Service\Access\Utils $accessUtils,
         private MailHub $mailHub,
-        private Security $security,
-        private JWTTokenManagerInterface $jwtManager,
         private BindFileService $bindFileService,
         private MessageBusInterface $messageBus,
         private EntityManagerInterface $entityManager