From d7ecdaa1cd66ee5390fea5dd45676116d30de41d Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 21 May 2024 08:37:51 +0200 Subject: [PATCH 1/2] !!! TASK: Deprecate setting NodeNames via cr commands --- .../Command/CreateNodeAggregateWithNode.php | 26 ++++++++++++-- ...gregateWithNodeAndSerializedProperties.php | 34 ++++++++++++++----- .../Feature/NodeCreation/NodeCreation.php | 4 ++- .../Command/CopyNodesRecursively.php | 23 +++++++++++-- .../Command/ChangeNodeAggregateName.php | 9 ++--- .../Bootstrap/Features/NodeCreation.php | 18 +++++----- .../Domain/Service/SiteServiceInternals.php | 3 +- 7 files changed, 87 insertions(+), 30 deletions(-) diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Command/CreateNodeAggregateWithNode.php b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Command/CreateNodeAggregateWithNode.php index 0a113a2f087..3616ceda798 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Command/CreateNodeAggregateWithNode.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Command/CreateNodeAggregateWithNode.php @@ -65,12 +65,11 @@ private function __construct( * @param OriginDimensionSpacePoint $originDimensionSpacePoint Origin of the new node in the dimension space. Will also be used to calculate a set of dimension points where the new node will cover from the configured specializations. * @param NodeAggregateId $parentNodeAggregateId The id of the node aggregate underneath which the new node is added * @param NodeAggregateId|null $succeedingSiblingNodeAggregateId Node aggregate id of the node's succeeding sibling (optional). If not given, the node will be added as the parent's first child - * @param NodeName|null $nodeName The node's optional name. Set if there is a meaningful relation to its parent that should be named. * @param PropertyValuesToWrite|null $initialPropertyValues The node's initial property values. Will be merged over the node type's default property values */ - public static function create(WorkspaceName $workspaceName, NodeAggregateId $nodeAggregateId, NodeTypeName $nodeTypeName, OriginDimensionSpacePoint $originDimensionSpacePoint, NodeAggregateId $parentNodeAggregateId, ?NodeAggregateId $succeedingSiblingNodeAggregateId = null, ?NodeName $nodeName = null, ?PropertyValuesToWrite $initialPropertyValues = null): self + public static function create(WorkspaceName $workspaceName, NodeAggregateId $nodeAggregateId, NodeTypeName $nodeTypeName, OriginDimensionSpacePoint $originDimensionSpacePoint, NodeAggregateId $parentNodeAggregateId, ?NodeAggregateId $succeedingSiblingNodeAggregateId = null, ?PropertyValuesToWrite $initialPropertyValues = null): self { - return new self($workspaceName, $nodeAggregateId, $nodeTypeName, $originDimensionSpacePoint, $parentNodeAggregateId, $initialPropertyValues ?: PropertyValuesToWrite::createEmpty(), $succeedingSiblingNodeAggregateId, $nodeName, NodeAggregateIdsByNodePaths::createEmpty()); + return new self($workspaceName, $nodeAggregateId, $nodeTypeName, $originDimensionSpacePoint, $parentNodeAggregateId, $initialPropertyValues ?: PropertyValuesToWrite::createEmpty(), $succeedingSiblingNodeAggregateId, null, NodeAggregateIdsByNodePaths::createEmpty()); } public function withInitialPropertyValues(PropertyValuesToWrite $newInitialPropertyValues): self @@ -130,4 +129,25 @@ public function withTetheredDescendantNodeAggregateIds(NodeAggregateIdsByNodePat $tetheredDescendantNodeAggregateIds, ); } + + /** + * The node's optional name. + * Set if there is a meaningful relation to its parent that should be named. + * + * @deprecated the concept regarding node-names for non-tethered nodes is outdated. + */ + public function withNodeName(NodeName $nodeName): self + { + return new self( + $this->workspaceName, + $this->nodeAggregateId, + $this->nodeTypeName, + $this->originDimensionSpacePoint, + $this->parentNodeAggregateId, + $this->initialPropertyValues, + $this->succeedingSiblingNodeAggregateId, + $nodeName, + $this->tetheredDescendantNodeAggregateIds, + ); + } } diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Command/CreateNodeAggregateWithNodeAndSerializedProperties.php b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Command/CreateNodeAggregateWithNodeAndSerializedProperties.php index 38cbc0b8e2a..f295cd6dabe 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Command/CreateNodeAggregateWithNodeAndSerializedProperties.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Command/CreateNodeAggregateWithNodeAndSerializedProperties.php @@ -24,7 +24,6 @@ use Neos\ContentRepository\Core\NodeType\NodeTypeName; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Node\NodeName; -use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** @@ -70,12 +69,11 @@ private function __construct( * @param OriginDimensionSpacePoint $originDimensionSpacePoint Origin of the new node in the dimension space. Will also be used to calculate a set of dimension points where the new node will cover from the configured specializations. * @param NodeAggregateId $parentNodeAggregateId The id of the node aggregate underneath which the new node is added * @param NodeAggregateId|null $succeedingSiblingNodeAggregateId Node aggregate id of the node's succeeding sibling (optional). If not given, the node will be added as the parent's first child - * @param NodeName|null $nodeName The node's optional name. Set if there is a meaningful relation to its parent that should be named. * @param SerializedPropertyValues|null $initialPropertyValues The node's initial property values (serialized). Will be merged over the node type's default property values */ - public static function create(WorkspaceName $workspaceName, NodeAggregateId $nodeAggregateId, NodeTypeName $nodeTypeName, OriginDimensionSpacePoint $originDimensionSpacePoint, NodeAggregateId $parentNodeAggregateId, NodeAggregateId $succeedingSiblingNodeAggregateId = null, NodeName $nodeName = null, SerializedPropertyValues $initialPropertyValues = null): self + public static function create(WorkspaceName $workspaceName, NodeAggregateId $nodeAggregateId, NodeTypeName $nodeTypeName, OriginDimensionSpacePoint $originDimensionSpacePoint, NodeAggregateId $parentNodeAggregateId, NodeAggregateId $succeedingSiblingNodeAggregateId = null, SerializedPropertyValues $initialPropertyValues = null): self { - return new self($workspaceName, $nodeAggregateId, $nodeTypeName, $originDimensionSpacePoint, $parentNodeAggregateId, $initialPropertyValues ?? SerializedPropertyValues::createEmpty(), $succeedingSiblingNodeAggregateId, $nodeName, NodeAggregateIdsByNodePaths::createEmpty()); + return new self($workspaceName, $nodeAggregateId, $nodeTypeName, $originDimensionSpacePoint, $parentNodeAggregateId, $initialPropertyValues ?? SerializedPropertyValues::createEmpty(), $succeedingSiblingNodeAggregateId, null, NodeAggregateIdsByNodePaths::createEmpty()); } /** @@ -105,11 +103,10 @@ public static function fromArray(array $array): self } /** - * Create a new CreateNodeAggregateWithNode command with all original values, - * except the tetheredDescendantNodeAggregateIds (where the passed in arguments are used). + * We precalculate all $tetheredDescendantNodeAggregateIds via {@see NodeAggregateIdsByNodePaths::completeForNodeOfType} + * so that when rebasing the command, it stays fully deterministic. * - * Is needed to make this command fully deterministic before storing it at the events - * - we need this + * See also the documentation of the higher level API {@see CreateNodeAggregateWithNode::withTetheredDescendantNodeAggregateIds} */ public function withTetheredDescendantNodeAggregateIds( NodeAggregateIdsByNodePaths $tetheredDescendantNodeAggregateIds @@ -127,6 +124,27 @@ public function withTetheredDescendantNodeAggregateIds( ); } + /** + * The node's optional name. + * Set if there is a meaningful relation to its parent that should be named. + * + * @deprecated the concept regarding node-names for non-tethered nodes is outdated. + */ + public function withNodeName(NodeName $nodeName): self + { + return new self( + $this->workspaceName, + $this->nodeAggregateId, + $this->nodeTypeName, + $this->originDimensionSpacePoint, + $this->parentNodeAggregateId, + $this->initialPropertyValues, + $this->succeedingSiblingNodeAggregateId, + $nodeName, + $this->tetheredDescendantNodeAggregateIds, + ); + } + /** * @return array */ diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/NodeCreation.php b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/NodeCreation.php index 3b61818e486..786fc358c44 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/NodeCreation.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/NodeCreation.php @@ -83,7 +83,6 @@ private function handleCreateNodeAggregateWithNode( $command->originDimensionSpacePoint, $command->parentNodeAggregateId, $command->succeedingSiblingNodeAggregateId, - $command->nodeName, $this->getPropertyConverter()->serializePropertyValues( $command->initialPropertyValues->withoutUnsets(), $this->requireNodeType($command->nodeTypeName) @@ -92,6 +91,9 @@ private function handleCreateNodeAggregateWithNode( if (!$command->tetheredDescendantNodeAggregateIds->isEmpty()) { $lowLevelCommand = $lowLevelCommand->withTetheredDescendantNodeAggregateIds($command->tetheredDescendantNodeAggregateIds); } + if ($command->nodeName) { + $lowLevelCommand = $lowLevelCommand->withNodeName($command->nodeName); + } return $this->handleCreateNodeAggregateWithNodeAndSerializedProperties($lowLevelCommand, $commandHandlingDependencies); } diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/Command/CopyNodesRecursively.php b/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/Command/CopyNodesRecursively.php index 6c1ebbf9dad..f49fddb1a71 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/Command/CopyNodesRecursively.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/Command/CopyNodesRecursively.php @@ -69,12 +69,11 @@ private function __construct( * @param OriginDimensionSpacePoint $targetDimensionSpacePoint the dimension space point which is the target of the copy * @param NodeAggregateId $targetParentNodeAggregateId Node aggregate id of the target node's parent. If not given, the node will be added as the parent's first child * @param NodeAggregateId|null $targetSucceedingSiblingNodeAggregateId Node aggregate id of the target node's succeeding sibling (optional) - * @param NodeName|null $targetNodeName the root node name of the root-inserted-node * @param NodeAggregateIdMapping $nodeAggregateIdMapping An assignment of "old" to "new" NodeAggregateIds ({@see NodeAggregateIdMapping}) */ - public static function create(WorkspaceName $workspaceName, NodeSubtreeSnapshot $nodeTreeToInsert, OriginDimensionSpacePoint $targetDimensionSpacePoint, NodeAggregateId $targetParentNodeAggregateId, ?NodeAggregateId $targetSucceedingSiblingNodeAggregateId, ?NodeName $targetNodeName, NodeAggregateIdMapping $nodeAggregateIdMapping): self + public static function create(WorkspaceName $workspaceName, NodeSubtreeSnapshot $nodeTreeToInsert, OriginDimensionSpacePoint $targetDimensionSpacePoint, NodeAggregateId $targetParentNodeAggregateId, ?NodeAggregateId $targetSucceedingSiblingNodeAggregateId, NodeAggregateIdMapping $nodeAggregateIdMapping): self { - return new self($workspaceName, $nodeTreeToInsert, $targetDimensionSpacePoint, $targetParentNodeAggregateId, $targetSucceedingSiblingNodeAggregateId, $targetNodeName, $nodeAggregateIdMapping); + return new self($workspaceName, $nodeTreeToInsert, $targetDimensionSpacePoint, $targetParentNodeAggregateId, $targetSucceedingSiblingNodeAggregateId, null, $nodeAggregateIdMapping); } /** @@ -167,4 +166,22 @@ public function createCopyForWorkspace( $this->nodeAggregateIdMapping ); } + + /** + * The target node's optional name. + * + * @deprecated the concept regarding node-names for non-tethered nodes is outdated. + */ + public function withNodeName(NodeName $nodeName): self + { + return new self( + $this->workspaceName, + $this->nodeTreeToInsert, + $this->targetDimensionSpacePoint, + $this->targetParentNodeAggregateId, + $this->targetSucceedingSiblingNodeAggregateId, + $nodeName, + $this->nodeAggregateIdMapping + ); + } } diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/Command/ChangeNodeAggregateName.php b/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/Command/ChangeNodeAggregateName.php index 3845fec6e1e..38d1f195ed6 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/Command/ChangeNodeAggregateName.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/Command/ChangeNodeAggregateName.php @@ -20,14 +20,15 @@ use Neos\ContentRepository\Core\Feature\WorkspacePublication\Dto\NodeIdToPublishOrDiscard; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Node\NodeName; -use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** - * All variants in a NodeAggregate have the same NodeName - and this can be changed here. - * This is the case because Node Names are usually only used for tethered nodes (=autocreated in the old CR); - * as then the Node Name is used for querying. + * All variants in a NodeAggregate have the same (optional) NodeName, which this can be changed here. * + * Node Names are usually only used for tethered nodes; as then the Node Name is used for querying. + * Tethered Nodes cannot be renamed via the command API. + * + * @deprecated the concept regarding node-names for non-tethered nodes is outdated. * @api commands are the write-API of the ContentRepository */ final readonly class ChangeNodeAggregateName implements diff --git a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCreation.php b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCreation.php index 499376eeea2..d20ebdab535 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCreation.php +++ b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCreation.php @@ -148,9 +148,6 @@ public function theCommandCreateNodeAggregateWithNodeIsExecutedWithPayload(Table isset($commandArguments['succeedingSiblingNodeAggregateId']) ? NodeAggregateId::fromString($commandArguments['succeedingSiblingNodeAggregateId']) : null, - isset($commandArguments['nodeName']) - ? NodeName::fromString($commandArguments['nodeName']) - : null, isset($commandArguments['initialPropertyValues']) ? $this->deserializeProperties($commandArguments['initialPropertyValues']) : null, @@ -158,6 +155,9 @@ public function theCommandCreateNodeAggregateWithNodeIsExecutedWithPayload(Table if (isset($commandArguments['tetheredDescendantNodeAggregateIds'])) { $command = $command->withTetheredDescendantNodeAggregateIds(NodeAggregateIdsByNodePaths::fromArray($commandArguments['tetheredDescendantNodeAggregateIds'])); } + if (isset($commandArguments['nodeName'])) { + $command = $command->withNodeName(NodeName::fromString($commandArguments['nodeName'])); + } $this->currentContentRepository->handle($command); } @@ -198,9 +198,6 @@ public function theFollowingCreateNodeAggregateWithNodeCommandsAreExecuted(Table !empty($row['succeedingSiblingNodeAggregateId']) ? NodeAggregateId::fromString($row['succeedingSiblingNodeAggregateId']) : null, - isset($row['nodeName']) - ? NodeName::fromString($row['nodeName']) - : null, isset($row['initialPropertyValues']) ? $this->parsePropertyValuesJsonString($row['initialPropertyValues']) : null, @@ -208,6 +205,9 @@ public function theFollowingCreateNodeAggregateWithNodeCommandsAreExecuted(Table if (isset($row['tetheredDescendantNodeAggregateIds'])) { $command = $command->withTetheredDescendantNodeAggregateIds(NodeAggregateIdsByNodePaths::fromJsonString($row['tetheredDescendantNodeAggregateIds'])); } + if (isset($row['nodeName'])) { + $command = $command->withNodeName(NodeName::fromString($row['nodeName'])); + } $this->currentContentRepository->handle($command); } } @@ -243,9 +243,6 @@ public function theCommandCreateNodeAggregateWithNodeAndSerializedPropertiesIsEx isset($commandArguments['succeedingSiblingNodeAggregateId']) ? NodeAggregateId::fromString($commandArguments['succeedingSiblingNodeAggregateId']) : null, - isset($commandArguments['nodeName']) - ? NodeName::fromString($commandArguments['nodeName']) - : null, isset($commandArguments['initialPropertyValues']) ? SerializedPropertyValues::fromArray($commandArguments['initialPropertyValues']) : null @@ -253,6 +250,9 @@ public function theCommandCreateNodeAggregateWithNodeAndSerializedPropertiesIsEx if (isset($commandArguments['tetheredDescendantNodeAggregateIds'])) { $command = $command->withTetheredDescendantNodeAggregateIds(NodeAggregateIdsByNodePaths::fromArray($commandArguments['tetheredDescendantNodeAggregateIds'])); } + if (isset($commandArguments['nodeName'])) { + $command = $command->withNodeName(NodeName::fromString($commandArguments['nodeName'])); + } $this->currentContentRepository->handle($command); } diff --git a/Neos.Neos/Classes/Domain/Service/SiteServiceInternals.php b/Neos.Neos/Classes/Domain/Service/SiteServiceInternals.php index 7412d45e57a..5ace6874f3a 100644 --- a/Neos.Neos/Classes/Domain/Service/SiteServiceInternals.php +++ b/Neos.Neos/Classes/Domain/Service/SiteServiceInternals.php @@ -116,11 +116,10 @@ public function createSiteNodeIfNotExists(Site $site, string $nodeTypeName): voi OriginDimensionSpacePoint::fromDimensionSpacePoint($arbitraryRootDimensionSpacePoint), $sitesNodeIdentifier, null, - $site->getNodeName()->toNodeName(), PropertyValuesToWrite::fromArray([ 'title' => $site->getName() ]) - )); + )->withNodeName($site->getNodeName()->toNodeName())); // Handle remaining root dimension space points by creating peer variants foreach ($rootDimensionSpacePoints as $rootDimensionSpacePoint) { From a63ad9e3074184fcfdba455de571d5da55d58f22 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 21 May 2024 11:46:05 +0200 Subject: [PATCH 2/2] TASK: Deprecate targetNodeName in `CopyNodesRecursively` --- .../Command/CopyNodesRecursively.php | 33 +++++++++---------- .../Bootstrap/Features/NodeCopying.php | 10 +++--- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/Command/CopyNodesRecursively.php b/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/Command/CopyNodesRecursively.php index f49fddb1a71..52355fd5e4a 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/Command/CopyNodesRecursively.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/Command/CopyNodesRecursively.php @@ -85,8 +85,7 @@ public static function createFromSubgraphAndStartNode( Node $startNode, OriginDimensionSpacePoint $dimensionSpacePoint, NodeAggregateId $targetParentNodeAggregateId, - ?NodeAggregateId $targetSucceedingSiblingNodeAggregateId, - ?NodeName $targetNodeName + ?NodeAggregateId $targetSucceedingSiblingNodeAggregateId ): self { $nodeSubtreeSnapshot = NodeSubtreeSnapshot::fromSubgraphAndStartNode($subgraph, $startNode); @@ -96,7 +95,7 @@ public static function createFromSubgraphAndStartNode( $dimensionSpacePoint, $targetParentNodeAggregateId, $targetSucceedingSiblingNodeAggregateId, - $targetNodeName, + null, NodeAggregateIdMapping::generateForNodeSubtreeSnapshot($nodeSubtreeSnapshot) ); } @@ -153,34 +152,34 @@ public function withNodeAggregateIdMapping( ); } - public function createCopyForWorkspace( - WorkspaceName $targetWorkspaceName, - ): self { + /** + * The target node's optional name. + * + * @deprecated the concept regarding node-names for non-tethered nodes is outdated. + */ + public function withTargetNodeName(NodeName $targetNodeName): self + { return new self( - $targetWorkspaceName, + $this->workspaceName, $this->nodeTreeToInsert, $this->targetDimensionSpacePoint, $this->targetParentNodeAggregateId, $this->targetSucceedingSiblingNodeAggregateId, - $this->targetNodeName, + $targetNodeName, $this->nodeAggregateIdMapping ); } - /** - * The target node's optional name. - * - * @deprecated the concept regarding node-names for non-tethered nodes is outdated. - */ - public function withNodeName(NodeName $nodeName): self - { + public function createCopyForWorkspace( + WorkspaceName $targetWorkspaceName, + ): self { return new self( - $this->workspaceName, + $targetWorkspaceName, $this->nodeTreeToInsert, $this->targetDimensionSpacePoint, $this->targetParentNodeAggregateId, $this->targetSucceedingSiblingNodeAggregateId, - $nodeName, + $this->targetNodeName, $this->nodeAggregateIdMapping ); } diff --git a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCopying.php b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCopying.php index 6c68de67e35..5b020a33873 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCopying.php +++ b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCopying.php @@ -49,9 +49,7 @@ public function theCommandCopyNodesRecursivelyIsExecutedCopyingTheCurrentNodeAgg $targetSucceedingSiblingNodeAggregateId = isset($commandArguments['targetSucceedingSiblingNodeAggregateId']) ? NodeAggregateId::fromString($commandArguments['targetSucceedingSiblingNodeAggregateId']) : null; - $targetNodeName = isset($commandArguments['targetNodeName']) - ? NodeName::fromString($commandArguments['targetNodeName']) - : null; + $workspaceName = isset($commandArguments['workspaceName']) ? WorkspaceName::fromString($commandArguments['workspaceName']) : $this->currentWorkspaceName; @@ -62,9 +60,11 @@ public function theCommandCopyNodesRecursivelyIsExecutedCopyingTheCurrentNodeAgg $this->currentNode, $targetDimensionSpacePoint, NodeAggregateId::fromString($commandArguments['targetParentNodeAggregateId']), - $targetSucceedingSiblingNodeAggregateId, - $targetNodeName + $targetSucceedingSiblingNodeAggregateId ); + if (isset($commandArguments['targetNodeName'])) { + $command = $command->withTargetNodeName(NodeName::fromString($commandArguments['targetNodeName'])); + } $command = $command->withNodeAggregateIdMapping(NodeAggregateIdMapping::fromArray($commandArguments['nodeAggregateIdMapping'])); $this->currentContentRepository->handle($command);