diff --git a/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php b/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php index 0d7142e9f..76a23be7c 100644 --- a/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php +++ b/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php @@ -51,7 +51,6 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") - * @Serializer\Groups({"read"}) */ private ?int $id = null; diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/EntitWorkflowStepNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/EntitWorkflowStepNormalizer.php new file mode 100644 index 000000000..ac6c31983 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/EntitWorkflowStepNormalizer.php @@ -0,0 +1,69 @@ +metadataExtractor = $metadataExtractor; + } + + /** + * @param EntityWorkflowStep $object + */ + public function normalize($object, ?string $format = null, array $context = []): array + { + $data = [ + 'type' => 'entity_workflow_step', + 'id' => $object->getId(), + 'comment' => $object->getComment(), + 'currentStep' => $this->metadataExtractor->buildArrayPresentationForPlace($object->getEntityWorkflow(), $object), + 'finalizeAfter' => $object->isFinalizeAfter(), + 'isFreezed' => false, + 'isFinalized' => false, + 'previousId' => null, + 'nextId' => null, + 'by' => null, + 'at' => null, + ]; + + if (null !== $previous = $object->getPrevious()) { + $data['previousId'] = $previous->getId(); + $data['isFreezed'] = $previous->isFreezeAfter(); + $data['isFinalized'] = $previous->isFreezeAfter(); + $data['by'] = $previous->getTransitionBy(); + $data['at'] = $previous->getTransitionAt(); + } + + if (null !== $next = $object->getNext()) { + $data['nextId'] = $next->getId(); + } + + return $data; + } + + public function supportsNormalization($data, ?string $format = null): bool + { + return $data instanceof EntityWorkflowStep && 'json' === $format; + } +} diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/EntityWorkflowNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/EntityWorkflowNormalizer.php new file mode 100644 index 000000000..8fad9d864 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/EntityWorkflowNormalizer.php @@ -0,0 +1,59 @@ +metadataExtractor = $metadataExtractor; + $this->registry = $registry; + } + + /** + * @param EntityWorkflow $object + * + * @return array + */ + public function normalize($object, ?string $format = null, array $context = []) + { + $workflow = $this->registry->get($object, $object->getWorkflowName()); + + return [ + 'type' => 'entity_workflow', + 'id' => $object->getId(), + 'relatedEntityClass' => $object->getRelatedEntityClass(), + 'relatedEntityId' => $object->getRelatedEntityId(), + 'workflow' => $this->metadataExtractor->buildArrayPresentationForWorkflow($workflow), + 'current_step' => $this->metadataExtractor->buildArrayPresentationForPlace($object), + 'steps' => $this->normalizer->normalize($object->getStepsChained(), $format, $context), + ]; + } + + public function supportsNormalization($data, ?string $format = null): bool + { + return $data instanceof EntityWorkflow && 'json' === $format; + } +} diff --git a/src/Bundle/ChillMainBundle/Workflow/Helper/MetadataExtractor.php b/src/Bundle/ChillMainBundle/Workflow/Helper/MetadataExtractor.php index 1f5af77c5..1484f6618 100644 --- a/src/Bundle/ChillMainBundle/Workflow/Helper/MetadataExtractor.php +++ b/src/Bundle/ChillMainBundle/Workflow/Helper/MetadataExtractor.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\MainBundle\Workflow\Helper; use Chill\MainBundle\Entity\Workflow\EntityWorkflow; +use Chill\MainBundle\Entity\Workflow\EntityWorkflowStep; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Symfony\Component\Workflow\Registry; use Symfony\Component\Workflow\WorkflowInterface; @@ -51,16 +52,17 @@ class MetadataExtractor return $workflowsList; } - public function buildArrayPresentationForPlace(EntityWorkflow $entityWorkflow): array + public function buildArrayPresentationForPlace(EntityWorkflow $entityWorkflow, ?EntityWorkflowStep $step = null): array { $workflow = $this->registry->get($entityWorkflow, $entityWorkflow->getWorkflowName()); + $step ??= $entityWorkflow->getCurrentStep(); - $markingMetadata = $workflow->getMetadataStore()->getPlaceMetadata($entityWorkflow->getCurrentStep()->getCurrentStep()); + $markingMetadata = $workflow->getMetadataStore()->getPlaceMetadata($step->getCurrentStep()); $text = array_key_exists('label', $markingMetadata) ? - $this->translatableStringHelper->localize($markingMetadata['label']) : $entityWorkflow->getCurrentStep()->getCurrentStep(); + $this->translatableStringHelper->localize($markingMetadata['label']) : $step->getCurrentStep(); - return ['name' => $entityWorkflow->getCurrentStep()->getCurrentStep(), 'text' => $text]; + return ['name' => $step->getCurrentStep(), 'text' => $text]; } public function buildArrayPresentationForWorkflow(WorkflowInterface $workflow): array