From 938a7fa9c7b8e5fa1d4bca11e18abb97260a20ba Mon Sep 17 00:00:00 2001 From: Niklas Natter Date: Fri, 15 May 2020 19:09:19 +0200 Subject: [PATCH] Set workflow place only on draft dimension --- .../DataMapper/WorkflowDataMapper.php | 32 +++++++++++++++++++ .../ContentWorkflow/ContentWorkflow.php | 2 +- Content/Domain/Model/WorkflowInterface.php | 4 +-- Content/Domain/Model/WorkflowTrait.php | 8 ++--- .../Doctrine/MetadataLoader.php | 2 +- Tests/Unit/Mocks/WorkflowMockWrapperTrait.php | 4 +-- 6 files changed, 42 insertions(+), 10 deletions(-) diff --git a/Content/Application/ContentDataMapper/DataMapper/WorkflowDataMapper.php b/Content/Application/ContentDataMapper/DataMapper/WorkflowDataMapper.php index d6aba756..ff2f3e52 100644 --- a/Content/Application/ContentDataMapper/DataMapper/WorkflowDataMapper.php +++ b/Content/Application/ContentDataMapper/DataMapper/WorkflowDataMapper.php @@ -46,6 +46,38 @@ public function map( */ private function setWorkflowData(WorkflowInterface $object, array $data): void { + $this->setInitialPlaceToDraftDimension($object, $data); + $this->setPublishedToLiveDimension($object, $data); + } + + /** + * @param mixed[] $data + */ + private function setInitialPlaceToDraftDimension(WorkflowInterface $object, array $data): void + { + // we want to set the initial place only to the draft dimension, the live dimension should not have a place + // after the place was set by this mapper initially, the place should only be changed by the ContentWorkflow + // see: https://github.com/sulu/SuluContentBundle/issues/92 + + if (!$object instanceof DimensionContentInterface + || DimensionInterface::STAGE_DRAFT !== $object->getDimension()->getStage()) { + return; + } + + if (!$object->getWorkflowPlace()) { + // TODO: get public workflow registry and set initial place based on $object::getWorkflowName() + $object->setWorkflowPlace(WorkflowInterface::WORKFLOW_PLACE_UNPUBLISHED); + } + } + + /** + * @param mixed[] $data + */ + private function setPublishedToLiveDimension(WorkflowInterface $object, array $data): void + { + // the published property of the draft dimension should only be changed by a ContentWorkflow subscriber + // therefore we only want to copy the published property from the draft to the live dimension + if (!$object instanceof DimensionContentInterface || DimensionInterface::STAGE_LIVE !== $object->getDimension()->getStage()) { return; diff --git a/Content/Application/ContentWorkflow/ContentWorkflow.php b/Content/Application/ContentWorkflow/ContentWorkflow.php index 3cff46ae..30bfcc71 100644 --- a/Content/Application/ContentWorkflow/ContentWorkflow.php +++ b/Content/Application/ContentWorkflow/ContentWorkflow.php @@ -72,7 +72,7 @@ public function __construct( $this->dimensionContentRepository = $dimensionContentRepository; $this->contentMerger = $contentMerger; $this->eventDispatcher = $eventDispatcher ?: new EventDispatcher(); - // TODO get workflow from outside + // TODO: get public workflow registry from outside $this->workflowRegistry = $workflowRegistry ?: new Registry(); $this->workflowRegistry->addWorkflow( $this->getWorkflow(), diff --git a/Content/Domain/Model/WorkflowInterface.php b/Content/Domain/Model/WorkflowInterface.php index 2d50ce7b..6c09f0fd 100644 --- a/Content/Domain/Model/WorkflowInterface.php +++ b/Content/Domain/Model/WorkflowInterface.php @@ -47,9 +47,9 @@ interface WorkflowInterface public static function getWorkflowName(): string; - public function getWorkflowPlace(): string; + public function getWorkflowPlace(): ?string; - public function setWorkflowPlace(string $workflowPlace): void; + public function setWorkflowPlace(?string $workflowPlace): void; public function getWorkflowPublished(): ?\DateTimeImmutable; diff --git a/Content/Domain/Model/WorkflowTrait.php b/Content/Domain/Model/WorkflowTrait.php index b40be988..c6cf9aaa 100644 --- a/Content/Domain/Model/WorkflowTrait.php +++ b/Content/Domain/Model/WorkflowTrait.php @@ -16,9 +16,9 @@ trait WorkflowTrait { /** - * @var string + * @var string|null */ - protected $workflowPlace = WorkflowInterface::WORKFLOW_PLACE_UNPUBLISHED; + protected $workflowPlace; /** * @var \DateTimeImmutable|null @@ -30,12 +30,12 @@ public static function getWorkflowName(): string return WorkflowInterface::WORKFLOW_DEFAULT_NAME; } - public function getWorkflowPlace(): string + public function getWorkflowPlace(): ?string { return $this->workflowPlace; } - public function setWorkflowPlace(string $workflowPlace): void + public function setWorkflowPlace(?string $workflowPlace): void { $this->workflowPlace = $workflowPlace; } diff --git a/Content/Infrastructure/Doctrine/MetadataLoader.php b/Content/Infrastructure/Doctrine/MetadataLoader.php index ba4033a7..31c3864f 100644 --- a/Content/Infrastructure/Doctrine/MetadataLoader.php +++ b/Content/Infrastructure/Doctrine/MetadataLoader.php @@ -100,7 +100,7 @@ public function loadClassMetadata(LoadClassMetadataEventArgs $event): void } if ($reflection->implementsInterface(WorkflowInterface::class)) { - $this->addField($metadata, 'workflowPlace', 'string', ['length' => 32, 'nullable' => false, 'default' => WorkflowInterface::WORKFLOW_PLACE_UNPUBLISHED]); + $this->addField($metadata, 'workflowPlace', 'string', ['length' => 32, 'nullable' => true]); $this->addField($metadata, 'workflowPublished', 'datetime_immutable', ['nullable' => true]); } } diff --git a/Tests/Unit/Mocks/WorkflowMockWrapperTrait.php b/Tests/Unit/Mocks/WorkflowMockWrapperTrait.php index db81d547..a7a6e203 100644 --- a/Tests/Unit/Mocks/WorkflowMockWrapperTrait.php +++ b/Tests/Unit/Mocks/WorkflowMockWrapperTrait.php @@ -25,12 +25,12 @@ public static function getWorkflowName(): string return 'mock-workflow-name'; } - public function getWorkflowPlace(): string + public function getWorkflowPlace(): ?string { return $this->instance->getWorkflowPlace(); } - public function setWorkflowPlace(string $workflowPlace): void + public function setWorkflowPlace(?string $workflowPlace): void { $this->instance->setWorkflowPlace($workflowPlace); }