Handle cases when there are multiple EntityWorkflows associated with one entity

This commit is contained in:
Julien Fastré 2024-07-15 18:58:08 +02:00
parent 31f842471a
commit 9e92ede16f
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
9 changed files with 31 additions and 25 deletions

View File

@ -11,7 +11,6 @@ declare(strict_types=1);
namespace Chill\DocStoreBundle\Service; namespace Chill\DocStoreBundle\Service;
use Chill\MainBundle\Entity\Workflow\EntityWorkflow;
use Chill\MainBundle\Workflow\EntityWorkflowManager; use Chill\MainBundle\Workflow\EntityWorkflowManager;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
@ -21,13 +20,10 @@ class WorkflowDocumentService
public function notBlockedByWorkflow(object $entity): bool public function notBlockedByWorkflow(object $entity): bool
{ {
/** $workflows = $this->entityWorkflowManager->findByRelatedEntity($entity);
* @var EntityWorkflow
*/
$workflow = $this->entityWorkflowManager->findByRelatedEntity($entity);
$currentUser = $this->security->getUser(); $currentUser = $this->security->getUser();
if (null != $workflow) { foreach ($workflows as $workflow) {
if ($workflow->isFinal()) { if ($workflow->isFinal()) {
return false; return false;
} }

View File

@ -121,10 +121,10 @@ readonly class AccompanyingCourseDocumentWorkflowHandler implements EntityWorkfl
return false; return false;
} }
public function findByRelatedEntity(object $object): ?EntityWorkflow public function findByRelatedEntity(object $object): array
{ {
if (!$object instanceof AccompanyingCourseDocument) { if (!$object instanceof AccompanyingCourseDocument) {
return null; return [];
} }
return $this->workflowRepository->findByRelatedEntity(AccompanyingCourseDocument::class, $object->getId()); return $this->workflowRepository->findByRelatedEntity(AccompanyingCourseDocument::class, $object->getId());

View File

@ -99,7 +99,10 @@ class EntityWorkflowRepository implements ObjectRepository
return $this->repository->findAll(); return $this->repository->findAll();
} }
public function findByRelatedEntity($entityClass, $relatedEntityId): ?EntityWorkflow /**
* @return list<EntityWorkflow>
*/
public function findByRelatedEntity($entityClass, $relatedEntityId): array
{ {
$qb = $this->repository->createQueryBuilder('w'); $qb = $this->repository->createQueryBuilder('w');

View File

@ -52,5 +52,8 @@ interface EntityWorkflowHandlerInterface
public function supportsFreeze(EntityWorkflow $entityWorkflow, array $options = []): bool; public function supportsFreeze(EntityWorkflow $entityWorkflow, array $options = []): bool;
public function findByRelatedEntity(object $object): ?EntityWorkflow; /**
* @return list<EntityWorkflow>
*/
public function findByRelatedEntity(object $object): array;
} }

View File

@ -38,12 +38,17 @@ class EntityWorkflowManager
return $this->registry->all($entityWorkflow); return $this->registry->all($entityWorkflow);
} }
public function findByRelatedEntity(object $object): ?EntityWorkflow /**
* @return list<EntityWorkflow>
*/
public function findByRelatedEntity(object $object): array
{ {
foreach ($this->handlers as $handler) { foreach ($this->handlers as $handler) {
return $handler->findByRelatedEntity($object); if ([] !== $workflows = $handler->findByRelatedEntity($object)) {
return $workflows;
}
} }
return null; return [];
} }
} }

View File

@ -13,7 +13,6 @@ namespace Chill\PersonBundle\Repository\AccompanyingPeriod;
use Chill\DocStoreBundle\Entity\StoredObject; use Chill\DocStoreBundle\Entity\StoredObject;
use Chill\DocStoreBundle\Repository\AssociatedEntityToStoredObjectInterface; use Chill\DocStoreBundle\Repository\AssociatedEntityToStoredObjectInterface;
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument; use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository; use Doctrine\ORM\EntityRepository;

View File

@ -135,10 +135,10 @@ class AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler implements EntityW
return false; return false;
} }
public function findByRelatedEntity(object $object): ?EntityWorkflow public function findByRelatedEntity(object $object): array
{ {
if (!$object instanceof AccompanyingPeriodWorkEvaluationDocument) { if (!$object instanceof AccompanyingPeriodWorkEvaluationDocument) {
return null; return [];
} }
return $this->workflowRepository->findByRelatedEntity(AccompanyingPeriodWorkEvaluationDocument::class, $object->getId()); return $this->workflowRepository->findByRelatedEntity(AccompanyingPeriodWorkEvaluationDocument::class, $object->getId());

View File

@ -21,13 +21,13 @@ use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkEvalu
use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodWorkEvaluationVoter; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodWorkEvaluationVoter;
use Symfony\Contracts\Translation\TranslatorInterface; use Symfony\Contracts\Translation\TranslatorInterface;
class AccompanyingPeriodWorkEvaluationWorkflowHandler implements EntityWorkflowHandlerInterface readonly class AccompanyingPeriodWorkEvaluationWorkflowHandler implements EntityWorkflowHandlerInterface
{ {
public function __construct( public function __construct(
private readonly AccompanyingPeriodWorkEvaluationRepository $repository, private AccompanyingPeriodWorkEvaluationRepository $repository,
private readonly EntityWorkflowRepository $workflowRepository, private EntityWorkflowRepository $workflowRepository,
private readonly TranslatableStringHelperInterface $translatableStringHelper, private TranslatableStringHelperInterface $translatableStringHelper,
private readonly TranslatorInterface $translator private TranslatorInterface $translator
) {} ) {}
public function getDeletionRoles(): array public function getDeletionRoles(): array
@ -121,10 +121,10 @@ class AccompanyingPeriodWorkEvaluationWorkflowHandler implements EntityWorkflowH
return false; return false;
} }
public function findByRelatedEntity(object $object): ?EntityWorkflow public function findByRelatedEntity(object $object): array
{ {
if (!$object instanceof AccompanyingPeriodWorkEvaluation) { if (!$object instanceof AccompanyingPeriodWorkEvaluation) {
return null; return [];
} }
return $this->workflowRepository->findByRelatedEntity(AccompanyingPeriodWorkEvaluation::class, $object->getId()); return $this->workflowRepository->findByRelatedEntity(AccompanyingPeriodWorkEvaluation::class, $object->getId());

View File

@ -128,10 +128,10 @@ class AccompanyingPeriodWorkWorkflowHandler implements EntityWorkflowHandlerInte
return false; return false;
} }
public function findByRelatedEntity(object $object): ?EntityWorkflow public function findByRelatedEntity(object $object): array
{ {
if (!$object instanceof AccompanyingPeriodWork) { if (!$object instanceof AccompanyingPeriodWork) {
return null; return [];
} }
return $this->workflowRepository->findByRelatedEntity(AccompanyingPeriodWork::class, $object->getId()); return $this->workflowRepository->findByRelatedEntity(AccompanyingPeriodWork::class, $object->getId());