diff --git a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/HierarchyIntegrityIsProvided.feature b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/HierarchyIntegrityIsProvided.feature index 95d7b7dc43a..61f5f04cc0f 100644 --- a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/HierarchyIntegrityIsProvided.feature +++ b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/HierarchyIntegrityIsProvided.feature @@ -26,6 +26,7 @@ Feature: Run integrity violation detection regarding hierarchy relations and nod | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/NodesHaveAtMostOneParentPerSubgraph.feature b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/NodesHaveAtMostOneParentPerSubgraph.feature index ad41177344f..c5829618048 100644 --- a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/NodesHaveAtMostOneParentPerSubgraph.feature +++ b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/NodesHaveAtMostOneParentPerSubgraph.feature @@ -26,6 +26,7 @@ Feature: Run integrity violation detection regarding parent relations | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -36,6 +37,7 @@ Feature: Run integrity violation detection regarding parent relations | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-nodeward-nodington-iii" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -46,6 +48,7 @@ Feature: Run integrity violation detection regarding parent relations | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/ReferenceIntegrityIsProvided.feature b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/ReferenceIntegrityIsProvided.feature index edfcaf5a09e..10e10455121 100644 --- a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/ReferenceIntegrityIsProvided.feature +++ b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/ReferenceIntegrityIsProvided.feature @@ -29,6 +29,7 @@ Feature: Run integrity violation detection regarding reference relations | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "source-nodandaise" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -38,6 +39,7 @@ Feature: Run integrity violation detection regarding reference relations | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "anthony-destinode" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/SiblingsAreDistinctlySorted.feature b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/SiblingsAreDistinctlySorted.feature index 9d32cf24fdc..3b97374aded 100644 --- a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/SiblingsAreDistinctlySorted.feature +++ b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/SiblingsAreDistinctlySorted.feature @@ -28,6 +28,7 @@ Feature: Run integrity violation detection regarding sibling sorting Scenario: Create two siblings and set the sorting to the same value When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -37,6 +38,7 @@ Feature: Run integrity violation detection regarding sibling sorting | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "noderella-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/SubtreeTagsAreInherited.feature b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/SubtreeTagsAreInherited.feature index f26a0f4a079..2a267ab5a9a 100644 --- a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/SubtreeTagsAreInherited.feature +++ b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/SubtreeTagsAreInherited.feature @@ -28,6 +28,7 @@ Feature: Run integrity violation detection regarding subtree tag inheritance Scenario: Create nodes, disable the topmost and remove some restriction edges manually When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -38,6 +39,7 @@ Feature: Run integrity violation detection regarding subtree tag inheritance | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-nodeward-nodington-iii" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -48,6 +50,7 @@ Feature: Run integrity violation detection regarding subtree tag inheritance | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -58,6 +61,7 @@ Feature: Run integrity violation detection regarding subtree tag inheritance | nodeAggregateClassification | "regular" | And the event SubtreeWasTagged was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | affectedDimensionSpacePoints | [{"language":"de"},{"language":"gsw"},{"language":"fr"}] | diff --git a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/TetheredNodesAreNamed.feature b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/TetheredNodesAreNamed.feature index fa72650db8c..c046fc63614 100644 --- a/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/TetheredNodesAreNamed.feature +++ b/Neos.ContentGraph.DoctrineDbalAdapter/Tests/Behavior/Features/Projection/ProjectionIntegrityViolationDetection/TetheredNodesAreNamed.feature @@ -26,6 +26,7 @@ Feature: Run projection integrity violation detection regarding naming of tether | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -38,6 +39,7 @@ Feature: Run projection integrity violation detection regarding naming of tether Scenario: Remove tethered node's name When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nodewyn-tetherton" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentRepository.BehavioralTests/Classes/Command/PerformanceMeasurementService.php b/Neos.ContentRepository.BehavioralTests/Classes/Command/PerformanceMeasurementService.php index 586c895e700..21c344d2f9d 100644 --- a/Neos.ContentRepository.BehavioralTests/Classes/Command/PerformanceMeasurementService.php +++ b/Neos.ContentRepository.BehavioralTests/Classes/Command/PerformanceMeasurementService.php @@ -45,6 +45,7 @@ class PerformanceMeasurementService implements ContentRepositoryServiceInterface { private ContentStreamId $contentStreamId; + private WorkspaceName $workspaceName; private DimensionSpacePointSet $dimensionSpacePoints; private ContentStreamEventStreamName $contentStreamEventStream; @@ -55,6 +56,7 @@ public function __construct( private readonly ContentRepositoryId $contentRepositoryId ) { $this->contentStreamId = contentStreamId::fromString('cs-identifier'); + $this->workspaceName = WorkspaceName::fromString('some-workspace'); $this->dimensionSpacePoints = new DimensionSpacePointSet([ DimensionSpacePoint::fromArray(['language' => 'mul']), DimensionSpacePoint::fromArray(['language' => 'de']), @@ -86,6 +88,7 @@ public function createNodesForPerformanceTest(int $nodesPerLevel, int $levels): $rootNodeAggregateId = nodeAggregateId::fromString('lady-eleonode-rootford'); $rootNodeAggregateWasCreated = new RootNodeAggregateWithNodeWasCreated( + $this->workspaceName, $this->contentStreamId, $rootNodeAggregateId, NodeTypeName::fromString('Neos.ContentRepository:Root'), @@ -129,6 +132,7 @@ private function createHierarchy( for ($i = 0; $i < $numberOfNodes; $i++) { $nodeAggregateId = nodeAggregateId::create(); $events[] = new NodeAggregateWithNodeWasCreated( + $this->workspaceName, $this->contentStreamId, $nodeAggregateId, NodeTypeName::fromString('Neos.ContentRepository:Testing'), diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/08-NodeMove/07-MoveNodeAggregateWithoutDimensions.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/08-NodeMove/07-MoveNodeAggregateWithoutDimensions.feature index bf8c29792df..cf44e1cc245 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/08-NodeMove/07-MoveNodeAggregateWithoutDimensions.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/08-NodeMove/07-MoveNodeAggregateWithoutDimensions.feature @@ -30,6 +30,7 @@ Feature: Move a node without content dimensions | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -40,6 +41,7 @@ Feature: Move a node without content dimensions | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -50,6 +52,7 @@ Feature: Move a node without content dimensions | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-nodeward-nodington-iii" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -130,6 +133,7 @@ Feature: Move a node without content dimensions Scenario: Move a node to a new parent and the end of its children Given the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "lady-abigail-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/01-ForkContentStream_ConstraintChecks.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/01-ForkContentStream_ConstraintChecks.feature index ab7c62addec..ec9d1f328b5 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/01-ForkContentStream_ConstraintChecks.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/01-ForkContentStream_ConstraintChecks.feature @@ -30,6 +30,7 @@ Feature: ForkContentStream Without Dimensions | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -40,6 +41,7 @@ Feature: ForkContentStream Without Dimensions | nodeAggregateClassification | "regular" | And the event NodePropertiesWereSet was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | originDimensionSpacePoint | {} | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/ForkContentStreamWithDisabledNodesWithoutDimensions.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/ForkContentStreamWithDisabledNodesWithoutDimensions.feature index 9c75bbad71b..7c1a3d39bfb 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/ForkContentStreamWithDisabledNodesWithoutDimensions.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/ForkContentStreamWithDisabledNodesWithoutDimensions.feature @@ -29,6 +29,7 @@ Feature: On forking a content stream, hidden nodes should be correctly copied as | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "the-great-nodini" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -39,6 +40,7 @@ Feature: On forking a content stream, hidden nodes should be correctly copied as | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nodingers-cat" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/ForkContentStreamWithoutDimensions.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/ForkContentStreamWithoutDimensions.feature index 3c813d29cc5..e11b4101278 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/ForkContentStreamWithoutDimensions.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ContentStreamForking/ForkContentStreamWithoutDimensions.feature @@ -30,6 +30,7 @@ Feature: ForkContentStream Without Dimensions | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -40,6 +41,7 @@ Feature: ForkContentStream Without Dimensions | nodeAggregateClassification | "regular" | And the event NodePropertiesWereSet was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | originDimensionSpacePoint | {} | @@ -63,6 +65,7 @@ Feature: ForkContentStream Without Dimensions | sourceContentStreamId | "cs-identifier" | And the event NodePropertiesWereSet was published with payload: | Key | Value | + | workspaceName | "user" | | contentStreamId | "user-cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | originDimensionSpacePoint | {} | @@ -92,6 +95,7 @@ Feature: ForkContentStream Without Dimensions | sourceContentStreamId | "cs-identifier" | And the event NodePropertiesWereSet was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | originDimensionSpacePoint | {} | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/NodeCopying/CopyNode_NoDimensions.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/NodeCopying/CopyNode_NoDimensions.feature index 981d0768d1f..26d8c20c84b 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/NodeCopying/CopyNode_NoDimensions.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/NodeCopying/CopyNode_NoDimensions.feature @@ -22,6 +22,7 @@ Feature: Copy nodes (without dimensions) | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -32,6 +33,7 @@ Feature: Copy nodes (without dimensions) | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -42,6 +44,7 @@ Feature: Copy nodes (without dimensions) | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-nodeward-nodington-iii" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/NodeRemoval/RemoveNodeAggregateAfterDisabling.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/NodeRemoval/RemoveNodeAggregateAfterDisabling.feature index 0af2e5895a5..93755f119ad 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/NodeRemoval/RemoveNodeAggregateAfterDisabling.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/NodeRemoval/RemoveNodeAggregateAfterDisabling.feature @@ -47,6 +47,7 @@ Feature: Disable a node aggregate | nodeVariantSelectionStrategy | "allVariants" | And the event NodeAggregateWasRemoved was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | affectedOccupiedDimensionSpacePoints | [{}] | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/AllNodesAreConnectedToARootNodePerSubgraph.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/AllNodesAreConnectedToARootNodePerSubgraph.feature index 42117f25546..cbf6e2c55b3 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/AllNodesAreConnectedToARootNodePerSubgraph.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/AllNodesAreConnectedToARootNodePerSubgraph.feature @@ -24,6 +24,7 @@ Feature: Run projection integrity violation detection regarding root connection Scenario: Create a cycle When the event RootNodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "lady-eleonode-rootford" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -31,6 +32,7 @@ Feature: Run projection integrity violation detection regarding root connection | nodeAggregateClassification | "root" | When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -41,6 +43,7 @@ Feature: Run projection integrity violation detection regarding root connection | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -51,6 +54,7 @@ Feature: Run projection integrity violation detection regarding root connection | nodeAggregateClassification | "regular" | And the event NodeAggregateWasMoved was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | newParentNodeAggregateId | "nody-mc-nodeface" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/AllNodesCoverTheirOrigin.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/AllNodesCoverTheirOrigin.feature index 32ae377655e..994c1eb3ed8 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/AllNodesCoverTheirOrigin.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/AllNodesCoverTheirOrigin.feature @@ -28,6 +28,7 @@ Feature: Run projection integrity violation detection to find nodes that do not Scenario: Create a node not covering its origin When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -38,6 +39,7 @@ Feature: Run projection integrity violation detection to find nodes that do not | nodeAggregateClassification | "regular" | When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/IntactContentGraph.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/IntactContentGraph.feature index 88f0b1e18b9..7a479d0ac9d 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/IntactContentGraph.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/IntactContentGraph.feature @@ -23,6 +23,7 @@ Feature: Create an intact content graph and run integrity violation detection Scenario: Create an intact content graph When the event RootNodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "lady-eleonode-rootford" | | nodeTypeName | "Neos.ContentRepository:Root" | @@ -30,6 +31,7 @@ Feature: Create an intact content graph and run integrity violation detection | nodeAggregateClassification | "root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -40,6 +42,7 @@ Feature: Create an intact content graph and run integrity violation detection | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -50,6 +53,7 @@ Feature: Create an intact content graph and run integrity violation detection | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-nodeward-nodington-iii" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -60,6 +64,7 @@ Feature: Create an intact content graph and run integrity violation detection | nodeAggregateClassification | "tethered" | And the event NodeReferencesWereSet was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | sourceNodeAggregateId | "nody-mc-nodeface" | | affectedSourceOriginDimensionSpacePoints | [{"language":"de"}] | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregateIdentifiersAreUniquePerSubgraph.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregateIdentifiersAreUniquePerSubgraph.feature index 3214306c7a7..39c4193a060 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregateIdentifiersAreUniquePerSubgraph.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregateIdentifiersAreUniquePerSubgraph.feature @@ -28,6 +28,7 @@ Feature: Create two nodes with the same node aggregate identifier in the same su Scenario: Create two node variants in the same subgraph When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -38,6 +39,7 @@ Feature: Create two nodes with the same node aggregate identifier in the same su | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregatesAreConsistentlyClassifiedPerContentStream.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregatesAreConsistentlyClassifiedPerContentStream.feature index a1dab9bff88..b77d54dc0f4 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregatesAreConsistentlyClassifiedPerContentStream.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregatesAreConsistentlyClassifiedPerContentStream.feature @@ -28,6 +28,7 @@ Feature: Run projection integrity violation detection regarding node aggregate c Scenario: Create node variants of different type When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -38,6 +39,7 @@ Feature: Run projection integrity violation detection regarding node aggregate c | nodeAggregateClassification | "regular" | When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregatesAreConsistentlyTypedPerContentStream.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregatesAreConsistentlyTypedPerContentStream.feature index c4ce8794373..c2ec9ff66af 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregatesAreConsistentlyTypedPerContentStream.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/NodeAggregatesAreConsistentlyTypedPerContentStream.feature @@ -30,6 +30,7 @@ Feature: Run projection integrity violation detection regarding node aggregate t Scenario: Create node variants of different type When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:DocumentA" | @@ -40,6 +41,7 @@ Feature: Run projection integrity violation detection regarding node aggregate t | nodeAggregateClassification | "regular" | When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:DocumentB" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/ReferenceIntegrityIsProvided.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/ReferenceIntegrityIsProvided.feature index 12401f354cc..ebd9f6528c8 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/ReferenceIntegrityIsProvided.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/ProjectionIntegrityViolationDetection/ReferenceIntegrityIsProvided.feature @@ -26,6 +26,7 @@ Feature: Run integrity violation detection regarding reference relations | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "source-nodandaise" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -37,6 +38,7 @@ Feature: Run integrity violation detection regarding reference relations Scenario: Reference a non-existing node aggregate When the event NodeReferencesWereSet was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | sourceNodeAggregateId | "source-nodandaise" | | affectedSourceOriginDimensionSpacePoints | [{"language":"de"}] | @@ -49,6 +51,7 @@ Feature: Run integrity violation detection regarding reference relations Scenario: Reference a node aggregate not covering any of the DSPs the source does When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "anthony-destinode" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -58,6 +61,7 @@ Feature: Run integrity violation detection regarding reference relations | nodeAggregateClassification | "regular" | And the event NodeReferencesWereSet was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | sourceNodeAggregateId | "source-nodandaise" | | affectedSourceOriginDimensionSpacePoints | [{"language":"de"}] | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/DisallowedChildNode.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/DisallowedChildNode.feature index bc08fc8725f..d11bf4b95e5 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/DisallowedChildNode.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/DisallowedChildNode.feature @@ -38,6 +38,7 @@ Feature: Remove disallowed Child Nodes and grandchild nodes # Node /document And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -49,6 +50,7 @@ Feature: Remove disallowed Child Nodes and grandchild nodes # Node /document/sub And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "subdoc" | | nodeTypeName | "Neos.ContentRepository.Testing:SubDocument" | @@ -126,6 +128,7 @@ Feature: Remove disallowed Child Nodes and grandchild nodes # Node /document And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -137,6 +140,7 @@ Feature: Remove disallowed Child Nodes and grandchild nodes # Node /document/sub And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "subdoc" | | nodeTypeName | "Neos.ContentRepository.Testing:SubDocument" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/Properties.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/Properties.feature index 9b63194f989..2edc8d07afd 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/Properties.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/Properties.feature @@ -114,6 +114,7 @@ Feature: Properties And the event NodePropertiesWereSet was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | originDimensionSpacePoint | {} | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/TetheredNodes.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/TetheredNodes.feature index 15daa4fe726..750248b3ad8 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/TetheredNodes.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/TetheredNodes.feature @@ -46,6 +46,7 @@ Feature: Tethered Nodes integrity violations # Node /document And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -58,6 +59,7 @@ Feature: Tethered Nodes integrity violations # Node /document/tethered-node And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nodewyn-tetherton" | | nodeTypeName | "Neos.ContentRepository.Testing:Tethered" | @@ -70,6 +72,7 @@ Feature: Tethered Nodes integrity violations # Node /document/tethered-node/tethered-leaf And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nodimer-tetherton" | | nodeTypeName | "Neos.ContentRepository.Testing:TetheredLeaf" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/UnknownNodeType.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/UnknownNodeType.feature index 69bea0d5390..22925ffc20f 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/UnknownNodeType.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/StructureAdjustment/UnknownNodeType.feature @@ -25,6 +25,7 @@ Feature: Unknown node types # Node /document And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W10-IndividualNodeDiscarding/02-BasicFeatures.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W10-IndividualNodeDiscarding/02-BasicFeatures.feature index 89ab495782d..cc223cb9d08 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W10-IndividualNodeDiscarding/02-BasicFeatures.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W10-IndividualNodeDiscarding/02-BasicFeatures.feature @@ -36,6 +36,7 @@ Feature: Discard individual nodes (basics) | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -46,6 +47,7 @@ Feature: Discard individual nodes (basics) | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -56,6 +58,7 @@ Feature: Discard individual nodes (basics) | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-nodeward-nodington-iii" | | nodeTypeName | "Neos.ContentRepository.Testing:Image" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/03-MoreBasicFeatures.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/03-MoreBasicFeatures.feature index 8b261cc14c1..463c01f2043 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/03-MoreBasicFeatures.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/03-MoreBasicFeatures.feature @@ -36,6 +36,7 @@ Feature: Publishing individual nodes (basics) | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -46,6 +47,7 @@ Feature: Publishing individual nodes (basics) | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -56,6 +58,7 @@ Feature: Publishing individual nodes (basics) | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-nodeward-nodington-iii" | | nodeTypeName | "Neos.ContentRepository.Testing:Image" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/04-AllFeaturePublication.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/04-AllFeaturePublication.feature index d0ee08d5e57..fc456d69214 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/04-AllFeaturePublication.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/04-AllFeaturePublication.feature @@ -45,6 +45,7 @@ Feature: Publishing hide/show scenario of nodes | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -55,6 +56,7 @@ Feature: Publishing hide/show scenario of nodes | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -65,6 +67,7 @@ Feature: Publishing hide/show scenario of nodes | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-nodeward-nodington-iii" | | nodeTypeName | "Neos.ContentRepository.Testing:Image" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/05-PublishMovedNodesWithoutDimensions.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/05-PublishMovedNodesWithoutDimensions.feature index da170cc530b..d403f26c698 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/05-PublishMovedNodesWithoutDimensions.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/W8-IndividualNodePublication/05-PublishMovedNodesWithoutDimensions.feature @@ -29,6 +29,7 @@ Feature: Publishing moved nodes without dimensions | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -39,6 +40,7 @@ Feature: Publishing moved nodes without dimensions | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -49,6 +51,7 @@ Feature: Publishing moved nodes without dimensions | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-nodeward-nodington-iii" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -145,6 +148,7 @@ Feature: Publishing moved nodes without dimensions Scenario: Publish the move of a node to a new parent and the end of its children Given the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "lady-abigail-nodenborough" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/Workspaces/NodeOperationsOnMultipleWorkspaces.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/Workspaces/NodeOperationsOnMultipleWorkspaces.feature index 43943c2e60e..eac6dd5e997 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/Workspaces/NodeOperationsOnMultipleWorkspaces.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/Workspaces/NodeOperationsOnMultipleWorkspaces.feature @@ -23,6 +23,7 @@ Feature: Single Node operations on multiple workspaces/content streams; e.g. cop | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | @@ -33,6 +34,7 @@ Feature: Single Node operations on multiple workspaces/content streams; e.g. cop | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nodingers-cat" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | diff --git a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/Workspaces/SingleNodeOperationsOnLiveWorkspace.feature b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/Workspaces/SingleNodeOperationsOnLiveWorkspace.feature index 4d6b6a90b55..25513e2d714 100644 --- a/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/Workspaces/SingleNodeOperationsOnLiveWorkspace.feature +++ b/Neos.ContentRepository.BehavioralTests/Tests/Behavior/Features/Workspaces/SingleNodeOperationsOnLiveWorkspace.feature @@ -25,6 +25,7 @@ Feature: Single Node operations on live workspace | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Content" | diff --git a/Neos.ContentRepository.Core/Classes/EventStore/EventNormalizer.php b/Neos.ContentRepository.Core/Classes/EventStore/EventNormalizer.php index f0bf2926419..9e9e239c5f3 100644 --- a/Neos.ContentRepository.Core/Classes/EventStore/EventNormalizer.php +++ b/Neos.ContentRepository.Core/Classes/EventStore/EventNormalizer.php @@ -164,8 +164,8 @@ public function denormalize(Event $event): EventInterface $eventInstance = $eventClassName::fromArray($eventDataAsArray); return match ($eventInstance::class) { // upcast disabled / enabled events to the corresponding SubtreeTag events - NodeAggregateWasDisabled::class => new SubtreeWasTagged($eventInstance->contentStreamId, $eventInstance->nodeAggregateId, $eventInstance->affectedDimensionSpacePoints, SubtreeTag::disabled()), - NodeAggregateWasEnabled::class => new SubtreeWasUntagged($eventInstance->contentStreamId, $eventInstance->nodeAggregateId, $eventInstance->affectedDimensionSpacePoints, SubtreeTag::disabled()), + NodeAggregateWasDisabled::class => new SubtreeWasTagged($eventInstance->workspaceName, $eventInstance->contentStreamId, $eventInstance->nodeAggregateId, $eventInstance->affectedDimensionSpacePoints, SubtreeTag::disabled()), + NodeAggregateWasEnabled::class => new SubtreeWasUntagged($eventInstance->workspaceName, $eventInstance->contentStreamId, $eventInstance->nodeAggregateId, $eventInstance->affectedDimensionSpacePoints, SubtreeTag::disabled()), default => $eventInstance, }; } diff --git a/Neos.ContentRepository.Core/Classes/Feature/Common/NodeAggregateEventPublisher.php b/Neos.ContentRepository.Core/Classes/Feature/Common/NodeAggregateEventPublisher.php index b9e1112c008..d92b5f892c0 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/Common/NodeAggregateEventPublisher.php +++ b/Neos.ContentRepository.Core/Classes/Feature/Common/NodeAggregateEventPublisher.php @@ -38,13 +38,13 @@ public static function enrichWithCommand( foreach ($events as $event) { if ($event instanceof DecoratedEvent) { $undecoratedEvent = $event->innerEvent; - if (!$undecoratedEvent instanceof PublishableToOtherContentStreamsInterface) { + if (!$undecoratedEvent instanceof PublishableToWorkspaceInterface) { throw new \RuntimeException(sprintf( 'TODO: Event %s has to implement PublishableToOtherContentStreamsInterface', get_class($event) )); } - } elseif (!$event instanceof PublishableToOtherContentStreamsInterface) { + } elseif (!$event instanceof PublishableToWorkspaceInterface) { throw new \RuntimeException(sprintf( 'TODO: Event %s has to implement PublishableToOtherContentStreamsInterface', get_class($event) diff --git a/Neos.ContentRepository.Core/Classes/Feature/Common/NodeVariationInternals.php b/Neos.ContentRepository.Core/Classes/Feature/Common/NodeVariationInternals.php index 08aaa79770a..98c265c892b 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/Common/NodeVariationInternals.php +++ b/Neos.ContentRepository.Core/Classes/Feature/Common/NodeVariationInternals.php @@ -14,7 +14,6 @@ namespace Neos\ContentRepository\Core\Feature\Common; -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\DimensionSpace; use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet; use Neos\ContentRepository\Core\DimensionSpace\OriginDimensionSpacePoint; @@ -28,7 +27,6 @@ use Neos\ContentRepository\Core\Projection\ContentGraph\NodeAggregate; use Neos\ContentRepository\Core\Projection\ContentGraph\VisibilityConstraints; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; -use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * @internal implementation details of command handlers @@ -102,6 +100,7 @@ protected function collectNodeSpecializationVariantsThatWillHaveBeenCreated( array $events ): array { $events[] = new NodeSpecializationVariantWasCreated( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $nodeAggregate->nodeAggregateId, $sourceOrigin, @@ -164,6 +163,7 @@ protected function collectNodeGeneralizationVariantsThatWillHaveBeenCreated( array $events ): array { $events[] = new NodeGeneralizationVariantWasCreated( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $nodeAggregate->nodeAggregateId, $sourceOrigin, @@ -226,6 +226,7 @@ protected function collectNodePeerVariantsThatWillHaveBeenCreated( array $events ): array { $events[] = new NodePeerVariantWasCreated( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $nodeAggregate->nodeAggregateId, $sourceOrigin, diff --git a/Neos.ContentRepository.Core/Classes/Feature/Common/PublishableToOtherContentStreamsInterface.php b/Neos.ContentRepository.Core/Classes/Feature/Common/PublishableToWorkspaceInterface.php similarity index 70% rename from Neos.ContentRepository.Core/Classes/Feature/Common/PublishableToOtherContentStreamsInterface.php rename to Neos.ContentRepository.Core/Classes/Feature/Common/PublishableToWorkspaceInterface.php index 5b90e1f10c5..2660b94b623 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/Common/PublishableToOtherContentStreamsInterface.php +++ b/Neos.ContentRepository.Core/Classes/Feature/Common/PublishableToWorkspaceInterface.php @@ -15,17 +15,18 @@ namespace Neos\ContentRepository\Core\Feature\Common; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** - * This interface is implemented by **events** which can be published to different content streams. + * This interface is implemented by **events** which can be published to different workspaces. * * Reminder: Event Publishing to a target content stream can not fail if the source content stream is based * on the target content stream, and no events have been committed to the target content stream in * the meantime. This is because event's effects have to be fully deterministic. * - * @internal used internally for the publishing mechanism of content streams + * @internal used internally for the publishing mechanism of workspaces */ -interface PublishableToOtherContentStreamsInterface +interface PublishableToWorkspaceInterface { - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self; + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self; } diff --git a/Neos.ContentRepository.Core/Classes/Feature/Common/TetheredNodeInternals.php b/Neos.ContentRepository.Core/Classes/Feature/Common/TetheredNodeInternals.php index 36f27b2e80a..a8717cb2088 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/Common/TetheredNodeInternals.php +++ b/Neos.ContentRepository.Core/Classes/Feature/Common/TetheredNodeInternals.php @@ -81,7 +81,8 @@ protected function createEventsForMissingTetheredNode( $rootGeneralizationOrigin = OriginDimensionSpacePoint::fromDimensionSpacePoint($rootGeneralization); if ($creationOriginDimensionSpacePoint) { $events[] = new NodePeerVariantWasCreated( - $parentNodeAggregate->contentStreamId, + $contentGraph->getWorkspaceName(), + $contentGraph->getContentStreamId(), $tetheredNodeAggregateId, $creationOriginDimensionSpacePoint, $rootGeneralizationOrigin, @@ -91,7 +92,8 @@ protected function createEventsForMissingTetheredNode( ); } else { $events[] = new NodeAggregateWithNodeWasCreated( - $parentNodeAggregate->contentStreamId, + $contentGraph->getWorkspaceName(), + $contentGraph->getContentStreamId(), $tetheredNodeAggregateId, $tetheredNodeTypeDefinition->nodeTypeName, $rootGeneralizationOrigin, @@ -107,44 +109,43 @@ protected function createEventsForMissingTetheredNode( } } return Events::fromArray($events); - } else { - return Events::with( - new NodeAggregateWithNodeWasCreated( - $parentNodeAggregate->contentStreamId, - $tetheredNodeAggregateId ?: NodeAggregateId::create(), - $tetheredNodeTypeDefinition->nodeTypeName, - $originDimensionSpacePoint, - InterdimensionalSiblings::fromDimensionSpacePointSetWithoutSucceedingSiblings( - $parentNodeAggregate->getCoverageByOccupant($originDimensionSpacePoint) - ), - $parentNodeAggregate->nodeAggregateId, - $tetheredNodeTypeDefinition->name, - $defaultProperties, - NodeAggregateClassification::CLASSIFICATION_TETHERED, - ) - ); } - } else { - if (!$childNodeAggregate->classification->isTethered()) { - throw new \RuntimeException( - 'We found a child node aggregate through the given node path; but it is not tethered.' - . ' We do not support re-tethering yet' - . ' (as this case should happen very rarely as far as we think).' - ); - } - - $childNodeSource = null; - foreach ($childNodeAggregate->getNodes() as $node) { - $childNodeSource = $node; - break; - } - /** @var Node $childNodeSource Node aggregates are never empty */ - return $this->createEventsForVariations( - $contentGraph, - $childNodeSource->originDimensionSpacePoint, - $originDimensionSpacePoint, - $parentNodeAggregate + return Events::with( + new NodeAggregateWithNodeWasCreated( + $contentGraph->getWorkspaceName(), + $contentGraph->getContentStreamId(), + $tetheredNodeAggregateId ?: NodeAggregateId::create(), + $tetheredNodeTypeDefinition->nodeTypeName, + $originDimensionSpacePoint, + InterdimensionalSiblings::fromDimensionSpacePointSetWithoutSucceedingSiblings( + $parentNodeAggregate->getCoverageByOccupant($originDimensionSpacePoint) + ), + $parentNodeAggregate->nodeAggregateId, + $tetheredNodeTypeDefinition->name, + $defaultProperties, + NodeAggregateClassification::CLASSIFICATION_TETHERED, + ) + ); + } + if (!$childNodeAggregate->classification->isTethered()) { + throw new \RuntimeException( + 'We found a child node aggregate through the given node path; but it is not tethered.' + . ' We do not support re-tethering yet' + . ' (as this case should happen very rarely as far as we think).' ); } + + $childNodeSource = null; + foreach ($childNodeAggregate->getNodes() as $node) { + $childNodeSource = $node; + break; + } + /** @var Node $childNodeSource Node aggregates are never empty */ + return $this->createEventsForVariations( + $contentGraph, + $childNodeSource->originDimensionSpacePoint, + $originDimensionSpacePoint, + $parentNodeAggregate + ); } } diff --git a/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/DimensionSpaceCommandHandler.php b/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/DimensionSpaceCommandHandler.php index dadb48a00cf..76998ff39a2 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/DimensionSpaceCommandHandler.php +++ b/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/DimensionSpaceCommandHandler.php @@ -79,6 +79,7 @@ private function handleMoveDimensionSpacePoint( $streamName, Events::with( new DimensionSpacePointWasMoved( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->source, $command->target @@ -108,6 +109,7 @@ private function handleAddDimensionShineThrough( $streamName, Events::with( new DimensionShineThroughWasAdded( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->source, $command->target diff --git a/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/Event/DimensionShineThroughWasAdded.php b/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/Event/DimensionShineThroughWasAdded.php index 15484ec7356..3b4a03ef1c3 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/Event/DimensionShineThroughWasAdded.php +++ b/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/Event/DimensionShineThroughWasAdded.php @@ -16,8 +16,9 @@ use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePoint; use Neos\ContentRepository\Core\EventStore\EventInterface; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * Add a Dimension Space Point Shine-Through; @@ -32,19 +33,21 @@ * * @api events are the persistence-API of the content repository */ -final readonly class DimensionShineThroughWasAdded implements EventInterface, PublishableToOtherContentStreamsInterface +final readonly class DimensionShineThroughWasAdded implements EventInterface, PublishableToWorkspaceInterface { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public DimensionSpacePoint $source, public DimensionSpacePoint $target ) { } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->source, $this->target ); @@ -53,6 +56,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), DimensionSpacePoint::fromArray($values['source']), DimensionSpacePoint::fromArray($values['target']) diff --git a/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/Event/DimensionSpacePointWasMoved.php b/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/Event/DimensionSpacePointWasMoved.php index f2d7a4eb923..a65486a3eeb 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/Event/DimensionSpacePointWasMoved.php +++ b/Neos.ContentRepository.Core/Classes/Feature/DimensionSpaceAdjustment/Event/DimensionSpacePointWasMoved.php @@ -16,8 +16,9 @@ use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePoint; use Neos\ContentRepository\Core\EventStore\EventInterface; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * Moved a dimension space point to a new location; basically moving all content to the new dimension space point. @@ -28,19 +29,21 @@ * * @api events are the persistence-API of the content repository */ -final readonly class DimensionSpacePointWasMoved implements EventInterface, PublishableToOtherContentStreamsInterface +final readonly class DimensionSpacePointWasMoved implements EventInterface, PublishableToWorkspaceInterface { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public DimensionSpacePoint $source, public DimensionSpacePoint $target ) { } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->source, $this->target ); @@ -49,6 +52,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), DimensionSpacePoint::fromArray($values['source']), DimensionSpacePoint::fromArray($values['target']) diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Event/NodeAggregateWithNodeWasCreated.php b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Event/NodeAggregateWithNodeWasCreated.php index b9ca1d1993a..0141ffd51e4 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Event/NodeAggregateWithNodeWasCreated.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/Event/NodeAggregateWithNodeWasCreated.php @@ -19,13 +19,14 @@ use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; use Neos\ContentRepository\Core\Feature\Common\InterdimensionalSiblings; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\Feature\NodeModification\Dto\SerializedPropertyValues; use Neos\ContentRepository\Core\NodeType\NodeTypeName; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateClassification; 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; /** * A node aggregate with its initial node was created @@ -34,10 +35,11 @@ */ final readonly class NodeAggregateWithNodeWasCreated implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public NodeTypeName $nodeTypeName, @@ -65,10 +67,11 @@ public function getOriginDimensionSpacePoint(): OriginDimensionSpacePoint return $this->originDimensionSpacePoint; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->nodeTypeName, $this->originDimensionSpacePoint, @@ -83,6 +86,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), NodeTypeName::fromString($values['nodeTypeName']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/NodeCreation.php b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/NodeCreation.php index 7dab242a4d3..3b61818e486 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/NodeCreation.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeCreation/NodeCreation.php @@ -231,6 +231,7 @@ private function createRegularWithNode( SerializedPropertyValues $initialPropertyValues, ): NodeAggregateWithNodeWasCreated { return new NodeAggregateWithNodeWasCreated( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $command->nodeTypeName, @@ -277,6 +278,7 @@ private function handleTetheredChildNodes( ); $events[] = new NodeAggregateWithNodeWasCreated( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $childNodeAggregateId, $tetheredNodeTypeDefinition->nodeTypeName, diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/Event/NodeAggregateWasDisabled.php b/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/Event/NodeAggregateWasDisabled.php index 410ba440eea..b16de3060ec 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/Event/NodeAggregateWasDisabled.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/Event/NodeAggregateWasDisabled.php @@ -17,10 +17,11 @@ use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\Feature\SubtreeTagging\Event\SubtreeWasTagged; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * A node aggregate was disabled @@ -30,10 +31,11 @@ */ final readonly class NodeAggregateWasDisabled implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, /** The dimension space points the node aggregate was disabled in */ @@ -51,10 +53,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->affectedDimensionSpacePoints, ); @@ -63,6 +66,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): EventInterface { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), DimensionSpacePointSet::fromArray($values['affectedDimensionSpacePoints']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/Event/NodeAggregateWasEnabled.php b/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/Event/NodeAggregateWasEnabled.php index 74f6a961339..6c0ef1aeac6 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/Event/NodeAggregateWasEnabled.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/Event/NodeAggregateWasEnabled.php @@ -18,10 +18,11 @@ use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\EventStore\EventNormalizer; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\Feature\SubtreeTagging\Event\SubtreeWasUntagged; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * A node aggregate was enabled @@ -31,10 +32,11 @@ */ final readonly class NodeAggregateWasEnabled implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public DimensionSpacePointSet $affectedDimensionSpacePoints, @@ -51,10 +53,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->affectedDimensionSpacePoints, ); @@ -63,6 +66,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): EventInterface { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), DimensionSpacePointSet::fromArray($values['affectedDimensionSpacePoints']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/NodeDisabling.php b/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/NodeDisabling.php index c74d9fce8c0..4b4727757c0 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/NodeDisabling.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeDisabling/NodeDisabling.php @@ -71,6 +71,7 @@ private function handleDisableNodeAggregate( $events = Events::with( new SubtreeWasTagged( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $affectedDimensionSpacePoints, @@ -126,6 +127,7 @@ public function handleEnableNodeAggregate( $events = Events::with( new SubtreeWasUntagged( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $affectedDimensionSpacePoints, diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/NodeDuplicationCommandHandler.php b/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/NodeDuplicationCommandHandler.php index 33452d7be36..7ef51daad82 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/NodeDuplicationCommandHandler.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeDuplication/NodeDuplicationCommandHandler.php @@ -195,6 +195,7 @@ private function createEventsForNodeToInsert( array &$events, ): void { $events[] = new NodeAggregateWithNodeWasCreated( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $nodeAggregateIdMapping->getNewNodeAggregateId( $nodeToInsert->nodeAggregateId diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeModification/Event/NodePropertiesWereSet.php b/Neos.ContentRepository.Core/Classes/Feature/NodeModification/Event/NodePropertiesWereSet.php index 2b50a230ac9..6827196656e 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeModification/Event/NodePropertiesWereSet.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeModification/Event/NodePropertiesWereSet.php @@ -18,11 +18,12 @@ use Neos\ContentRepository\Core\DimensionSpace\OriginDimensionSpacePoint; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\Feature\NodeModification\Dto\SerializedPropertyValues; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Node\PropertyNames; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * When a node property is changed, this event is triggered. @@ -37,10 +38,11 @@ */ final readonly class NodePropertiesWereSet implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public OriginDimensionSpacePoint $originDimensionSpacePoint, @@ -66,10 +68,11 @@ public function getOriginDimensionSpacePoint(): OriginDimensionSpacePoint return $this->originDimensionSpacePoint; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->originDimensionSpacePoint, $this->affectedDimensionSpacePoints, @@ -81,6 +84,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public function mergeProperties(self $other): self { return new self( + $this->workspaceName, $this->contentStreamId, $this->nodeAggregateId, $this->originDimensionSpacePoint, @@ -93,6 +97,7 @@ public function mergeProperties(self $other): self public static function fromArray(array $values): EventInterface { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), OriginDimensionSpacePoint::fromArray($values['originDimensionSpacePoint']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeModification/NodeModification.php b/Neos.ContentRepository.Core/Classes/Feature/NodeModification/NodeModification.php index ec347b252fd..e4633ca163d 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeModification/NodeModification.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeModification/NodeModification.php @@ -96,6 +96,7 @@ private function handleSetSerializedNodeProperties( ); foreach ($affectedOrigins as $affectedOrigin) { $events[] = new NodePropertiesWereSet( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $affectedOrigin, @@ -115,6 +116,7 @@ private function handleSetSerializedNodeProperties( ); foreach ($affectedOrigins as $affectedOrigin) { $events[] = new NodePropertiesWereSet( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $affectedOrigin, diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeMove/Event/NodeAggregateWasMoved.php b/Neos.ContentRepository.Core/Classes/Feature/NodeMove/Event/NodeAggregateWasMoved.php index 6bf52b0cf76..c8e5e0e29c5 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeMove/Event/NodeAggregateWasMoved.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeMove/Event/NodeAggregateWasMoved.php @@ -9,9 +9,10 @@ use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; use Neos\ContentRepository\Core\Feature\Common\InterdimensionalSibling; use Neos\ContentRepository\Core\Feature\Common\InterdimensionalSiblings; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * A node aggregate was moved in a content stream @@ -50,10 +51,11 @@ */ final readonly class NodeAggregateWasMoved implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public ?NodeAggregateId $newParentNodeAggregateId, @@ -71,10 +73,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->newParentNodeAggregateId, $this->succeedingSiblingsForCoverage, @@ -109,6 +112,7 @@ public static function fromArray(array $values): self } return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), $newParentNodeAggregateId, diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeMove/NodeMove.php b/Neos.ContentRepository.Core/Classes/Feature/NodeMove/NodeMove.php index 055407245ee..f19d07f7a87 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeMove/NodeMove.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeMove/NodeMove.php @@ -183,6 +183,7 @@ private function handleMoveNodeAggregate( $events = Events::with( new NodeAggregateWasMoved( + $command->workspaceName, $contentStreamId, $command->nodeAggregateId, $command->newParentNodeAggregateId, diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeReferencing/Event/NodeReferencesWereSet.php b/Neos.ContentRepository.Core/Classes/Feature/NodeReferencing/Event/NodeReferencesWereSet.php index e42aaaf821a..27f3bd49c11 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeReferencing/Event/NodeReferencesWereSet.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeReferencing/Event/NodeReferencesWereSet.php @@ -7,11 +7,12 @@ use Neos\ContentRepository\Core\DimensionSpace\OriginDimensionSpacePointSet; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\Feature\NodeReferencing\Dto\SerializedNodeReferences; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Node\ReferenceName; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * Named references with optional properties were created from source node to destination node(s) @@ -22,10 +23,11 @@ */ final readonly class NodeReferencesWereSet implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $sourceNodeAggregateId, /** @@ -40,17 +42,6 @@ public function __construct( ) { } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self - { - return new self( - $targetContentStreamId, - $this->sourceNodeAggregateId, - $this->affectedSourceOriginDimensionSpacePoints, - $this->referenceName, - $this->references, - ); - } - public function getContentStreamId(): ContentStreamId { return $this->contentStreamId; @@ -67,9 +58,22 @@ public function getNodeAggregateId(): NodeAggregateId return $this->sourceNodeAggregateId; } + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self + { + return new self( + $targetWorkspaceName, + $contentStreamId, + $this->sourceNodeAggregateId, + $this->affectedSourceOriginDimensionSpacePoints, + $this->referenceName, + $this->references, + ); + } + public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['sourceNodeAggregateId']), OriginDimensionSpacePointSet::fromArray($values['affectedSourceOriginDimensionSpacePoints']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeReferencing/NodeReferencing.php b/Neos.ContentRepository.Core/Classes/Feature/NodeReferencing/NodeReferencing.php index 9134d910691..6749780c5ed 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeReferencing/NodeReferencing.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeReferencing/NodeReferencing.php @@ -150,6 +150,7 @@ private function handleSetSerializedNodeReferences( $events = Events::with( new NodeReferencesWereSet( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->sourceNodeAggregateId, $affectedOrigins, diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeRemoval/Event/NodeAggregateWasRemoved.php b/Neos.ContentRepository.Core/Classes/Feature/NodeRemoval/Event/NodeAggregateWasRemoved.php index e469c4630ea..e31b4202e69 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeRemoval/Event/NodeAggregateWasRemoved.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeRemoval/Event/NodeAggregateWasRemoved.php @@ -18,20 +18,22 @@ use Neos\ContentRepository\Core\DimensionSpace\OriginDimensionSpacePointSet; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\Feature\NodeRemoval\Command\RemoveNodeAggregate; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * @api events are the persistence-API of the content repository */ final readonly class NodeAggregateWasRemoved implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public OriginDimensionSpacePointSet $affectedOccupiedDimensionSpacePoints, @@ -51,10 +53,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new NodeAggregateWasRemoved( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->affectedOccupiedDimensionSpacePoints, $this->affectedCoveredDimensionSpacePoints, @@ -65,6 +68,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), OriginDimensionSpacePointSet::fromArray($values['affectedOccupiedDimensionSpacePoints']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeRemoval/NodeRemoval.php b/Neos.ContentRepository.Core/Classes/Feature/NodeRemoval/NodeRemoval.php index 41a8c5c7eed..e6b62d986b1 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeRemoval/NodeRemoval.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeRemoval/NodeRemoval.php @@ -71,6 +71,7 @@ private function handleRemoveNodeAggregate( $events = Events::with( new NodeAggregateWasRemoved( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $command->nodeVariantSelectionStrategy->resolveAffectedOriginDimensionSpacePoints( diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/Event/NodeAggregateNameWasChanged.php b/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/Event/NodeAggregateNameWasChanged.php index 521f35b1a49..743d33f3a2c 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/Event/NodeAggregateNameWasChanged.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/Event/NodeAggregateNameWasChanged.php @@ -16,20 +16,22 @@ use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; 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; /** * @api events are the persistence-API of the content repository */ final readonly class NodeAggregateNameWasChanged implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public NodeName $newNodeName, @@ -46,10 +48,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->newNodeName, ); @@ -58,6 +61,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), NodeName::fromString($values['newNodeName']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/NodeRenaming.php b/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/NodeRenaming.php index 547a0693554..ab2af2b4bb6 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/NodeRenaming.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeRenaming/NodeRenaming.php @@ -52,6 +52,7 @@ private function handleChangeNodeAggregateName(ChangeNodeAggregateName $command, $events = Events::with( new NodeAggregateNameWasChanged( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $command->newNodeName, diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeTypeChange/Event/NodeAggregateTypeWasChanged.php b/Neos.ContentRepository.Core/Classes/Feature/NodeTypeChange/Event/NodeAggregateTypeWasChanged.php index 8f72cfd3336..eb20cb562fd 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeTypeChange/Event/NodeAggregateTypeWasChanged.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeTypeChange/Event/NodeAggregateTypeWasChanged.php @@ -16,20 +16,22 @@ use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\NodeType\NodeTypeName; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * @api events are the persistence-API of the content repository */ final readonly class NodeAggregateTypeWasChanged implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public NodeTypeName $newNodeTypeName @@ -46,10 +48,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->newNodeTypeName ); @@ -58,6 +61,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), NodeTypeName::fromString($values['newNodeTypeName']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeTypeChange/NodeTypeChange.php b/Neos.ContentRepository.Core/Classes/Feature/NodeTypeChange/NodeTypeChange.php index 9b8fe91d363..928615eb131 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeTypeChange/NodeTypeChange.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeTypeChange/NodeTypeChange.php @@ -39,6 +39,8 @@ use Neos\ContentRepository\Core\SharedModel\Exception\NodeTypeNotFound; 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; /** @codingStandardsIgnoreStart */ /** @codingStandardsIgnoreEnd */ @@ -159,6 +161,7 @@ private function handleChangeNodeAggregateType( **************/ $events = [ new NodeAggregateTypeWasChanged( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $command->newNodeTypeName @@ -297,6 +300,7 @@ private function deleteDisallowedNodesWhenChangingNodeType( ); // AND REMOVE THEM $events[] = $this->removeNodeInDimensionSpacePointSet( + $contentGraph, $childNodeAggregate, $dimensionSpacePointsToBeRemoved, ); @@ -329,6 +333,7 @@ private function deleteDisallowedNodesWhenChangingNodeType( ); // AND REMOVE THEM $events[] = $this->removeNodeInDimensionSpacePointSet( + $contentGraph, $grandchildNodeAggregate, $dimensionSpacePointsToBeRemoved, ); @@ -360,6 +365,7 @@ private function deleteObsoleteTetheredNodesWhenChangingNodeType( ); // AND REMOVE THEM $events[] = $this->removeNodeInDimensionSpacePointSet( + $contentGraph, $tetheredNodeAggregate, $dimensionSpacePointsToBeRemoved, ); @@ -414,11 +420,13 @@ private function findDimensionSpacePointsConnectingParentAndChildAggregate( } private function removeNodeInDimensionSpacePointSet( + ContentGraphInterface $contentGraph, NodeAggregate $nodeAggregate, DimensionSpacePointSet $coveredDimensionSpacePointsToBeRemoved, ): NodeAggregateWasRemoved { return new NodeAggregateWasRemoved( - $nodeAggregate->contentStreamId, + $contentGraph->getWorkspaceName(), + $contentGraph->getContentStreamId(), $nodeAggregate->nodeAggregateId, // TODO: we also use the covered dimension space points as OCCUPIED dimension space points // - however the OCCUPIED dimension space points are not really used by now diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodeGeneralizationVariantWasCreated.php b/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodeGeneralizationVariantWasCreated.php index 134f248b7d8..1826a1045cf 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodeGeneralizationVariantWasCreated.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodeGeneralizationVariantWasCreated.php @@ -19,9 +19,10 @@ use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; use Neos\ContentRepository\Core\Feature\Common\InterdimensionalSiblings; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * A node generalization variant was created @@ -30,10 +31,11 @@ */ final readonly class NodeGeneralizationVariantWasCreated implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public OriginDimensionSpacePoint $sourceOrigin, @@ -52,11 +54,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream( - ContentStreamId $targetContentStreamId - ): self { + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self + { return new NodeGeneralizationVariantWasCreated( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->sourceOrigin, $this->generalizationOrigin, @@ -67,6 +69,7 @@ public function createCopyForContentStream( public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), OriginDimensionSpacePoint::fromArray($values['sourceOrigin']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodePeerVariantWasCreated.php b/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodePeerVariantWasCreated.php index 5c03b55a2aa..226e0c789a3 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodePeerVariantWasCreated.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodePeerVariantWasCreated.php @@ -19,19 +19,21 @@ use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; use Neos\ContentRepository\Core\Feature\Common\InterdimensionalSiblings; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * @api events are the persistence-API of the content repository */ final readonly class NodePeerVariantWasCreated implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public OriginDimensionSpacePoint $sourceOrigin, @@ -50,10 +52,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->sourceOrigin, $this->peerOrigin, @@ -64,6 +67,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), OriginDimensionSpacePoint::fromArray($values['sourceOrigin']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodeSpecializationVariantWasCreated.php b/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodeSpecializationVariantWasCreated.php index 2fac714a1e8..0e757c8b88b 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodeSpecializationVariantWasCreated.php +++ b/Neos.ContentRepository.Core/Classes/Feature/NodeVariation/Event/NodeSpecializationVariantWasCreated.php @@ -19,9 +19,10 @@ use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; use Neos\ContentRepository\Core\Feature\Common\InterdimensionalSiblings; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * A node specialization variant was created @@ -30,10 +31,11 @@ */ final readonly class NodeSpecializationVariantWasCreated implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public OriginDimensionSpacePoint $sourceOrigin, @@ -51,10 +53,11 @@ public function getNodeAggregateId(): NodeAggregateId { return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->sourceOrigin, $this->specializationOrigin, @@ -65,6 +68,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), OriginDimensionSpacePoint::fromArray($values['sourceOrigin']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/Event/RootNodeAggregateDimensionsWereUpdated.php b/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/Event/RootNodeAggregateDimensionsWereUpdated.php index cfee0dcd88d..e444a3232e0 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/Event/RootNodeAggregateDimensionsWereUpdated.php +++ b/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/Event/RootNodeAggregateDimensionsWereUpdated.php @@ -17,9 +17,10 @@ use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * A root node aggregate is now visible in other dimensions. Needed when configured dimensions @@ -29,10 +30,11 @@ */ final readonly class RootNodeAggregateDimensionsWereUpdated implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, /** Root nodes by definition cover *all* dimension space points; so we need to include the full list here. */ @@ -50,10 +52,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->coveredDimensionSpacePoints, ); @@ -62,6 +65,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), DimensionSpacePointSet::fromArray($values['coveredDimensionSpacePoints']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/Event/RootNodeAggregateWithNodeWasCreated.php b/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/Event/RootNodeAggregateWithNodeWasCreated.php index 0e4ec1263d3..0ca33871bfd 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/Event/RootNodeAggregateWithNodeWasCreated.php +++ b/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/Event/RootNodeAggregateWithNodeWasCreated.php @@ -17,11 +17,12 @@ use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\NodeType\NodeTypeName; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateClassification; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * A root node aggregate and its initial node were created @@ -30,10 +31,11 @@ */ final readonly class RootNodeAggregateWithNodeWasCreated implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public NodeTypeName $nodeTypeName, @@ -53,10 +55,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->nodeTypeName, $this->coveredDimensionSpacePoints, @@ -67,6 +70,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): self { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), NodeTypeName::fromString($values['nodeTypeName']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/RootNodeHandling.php b/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/RootNodeHandling.php index 1da944e09c9..f09fc214aaf 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/RootNodeHandling.php +++ b/Neos.ContentRepository.Core/Classes/Feature/RootNodeCreation/RootNodeHandling.php @@ -42,6 +42,7 @@ 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; /** * @internal implementation detail of Command Handlers @@ -103,6 +104,7 @@ private function handleCreateRootNodeAggregateWithNode( foreach ($this->getInterDimensionalVariationGraph()->getRootGeneralizations() as $rootGeneralization) { array_push($events, ...iterator_to_array($this->handleTetheredRootChildNodes( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $nodeType, OriginDimensionSpacePoint::fromDimensionSpacePoint($rootGeneralization), @@ -130,6 +132,7 @@ private function createRootWithNode( DimensionSpacePointSet $coveredDimensionSpacePoints ): RootNodeAggregateWithNodeWasCreated { return new RootNodeAggregateWithNodeWasCreated( + $command->workspaceName, $contentStreamId, $command->nodeAggregateId, $command->nodeTypeName, @@ -158,6 +161,7 @@ private function handleUpdateRootNodeAggregateDimensions( $events = Events::with( new RootNodeAggregateDimensionsWereUpdated( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $this->getAllowedDimensionSubspace() @@ -182,6 +186,7 @@ private function handleUpdateRootNodeAggregateDimensions( * @throws NodeTypeNotFound */ private function handleTetheredRootChildNodes( + WorkspaceName $workspaceName, ContentStreamId $contentStreamId, NodeType $nodeType, OriginDimensionSpacePoint $originDimensionSpacePoint, @@ -201,6 +206,7 @@ private function handleTetheredRootChildNodes( $initialPropertyValues = SerializedPropertyValues::defaultFromNodeType($childNodeType, $this->getPropertyConverter()); $events[] = $this->createTetheredWithNodeForRoot( + $workspaceName, $contentStreamId, $childNodeAggregateId, $tetheredNodeTypeDefinition->nodeTypeName, @@ -212,6 +218,7 @@ private function handleTetheredRootChildNodes( ); array_push($events, ...iterator_to_array($this->handleTetheredRootChildNodes( + $workspaceName, $contentStreamId, $childNodeType, $originDimensionSpacePoint, @@ -226,6 +233,7 @@ private function handleTetheredRootChildNodes( } private function createTetheredWithNodeForRoot( + WorkspaceName $workspaceName, ContentStreamId $contentStreamId, NodeAggregateId $nodeAggregateId, NodeTypeName $nodeTypeName, @@ -236,6 +244,7 @@ private function createTetheredWithNodeForRoot( SerializedPropertyValues $initialPropertyValues, ): NodeAggregateWithNodeWasCreated { return new NodeAggregateWithNodeWasCreated( + $workspaceName, $contentStreamId, $nodeAggregateId, $nodeTypeName, diff --git a/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/Event/SubtreeWasTagged.php b/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/Event/SubtreeWasTagged.php index 27852d5b18c..224594af9cb 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/Event/SubtreeWasTagged.php +++ b/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/Event/SubtreeWasTagged.php @@ -17,10 +17,11 @@ use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\Feature\SubtreeTagging\Dto\SubtreeTag; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * A {@see SubtreeTag} was added to a node aggregate and effectively to its descendants @@ -29,7 +30,7 @@ */ final readonly class SubtreeWasTagged implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { /** @@ -39,6 +40,7 @@ * @param SubtreeTag $tag The tag that was added */ public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public DimensionSpacePointSet $affectedDimensionSpacePoints, @@ -56,10 +58,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->affectedDimensionSpacePoints, $this->tag, @@ -69,6 +72,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): EventInterface { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), DimensionSpacePointSet::fromArray($values['affectedDimensionSpacePoints']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/Event/SubtreeWasUntagged.php b/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/Event/SubtreeWasUntagged.php index 88594144544..ad19ff68107 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/Event/SubtreeWasUntagged.php +++ b/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/Event/SubtreeWasUntagged.php @@ -17,10 +17,11 @@ use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamAndNodeAggregateId; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\Feature\SubtreeTagging\Dto\SubtreeTag; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; /** * A {@see SubtreeTag} was removed from a node aggregate and effectively from its descendants @@ -30,7 +31,7 @@ */ final readonly class SubtreeWasUntagged implements EventInterface, - PublishableToOtherContentStreamsInterface, + PublishableToWorkspaceInterface, EmbedsContentStreamAndNodeAggregateId { /** @@ -40,6 +41,7 @@ * @param SubtreeTag $tag The tag that was removed */ public function __construct( + public WorkspaceName $workspaceName, public ContentStreamId $contentStreamId, public NodeAggregateId $nodeAggregateId, public DimensionSpacePointSet $affectedDimensionSpacePoints, @@ -57,10 +59,11 @@ public function getNodeAggregateId(): NodeAggregateId return $this->nodeAggregateId; } - public function createCopyForContentStream(ContentStreamId $targetContentStreamId): self + public function withWorkspaceNameAndContentStreamId(WorkspaceName $targetWorkspaceName, ContentStreamId $contentStreamId): self { return new self( - $targetContentStreamId, + $targetWorkspaceName, + $contentStreamId, $this->nodeAggregateId, $this->affectedDimensionSpacePoints, $this->tag, @@ -70,6 +73,7 @@ public function createCopyForContentStream(ContentStreamId $targetContentStreamI public static function fromArray(array $values): EventInterface { return new self( + WorkspaceName::fromString($values['workspaceName']), ContentStreamId::fromString($values['contentStreamId']), NodeAggregateId::fromString($values['nodeAggregateId']), DimensionSpacePointSet::fromArray($values['affectedDimensionSpacePoints']), diff --git a/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/SubtreeTagging.php b/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/SubtreeTagging.php index d16e300dfe5..d26f8c30118 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/SubtreeTagging.php +++ b/Neos.ContentRepository.Core/Classes/Feature/SubtreeTagging/SubtreeTagging.php @@ -60,6 +60,7 @@ private function handleTagSubtree(TagSubtree $command, CommandHandlingDependenci $events = Events::with( new SubtreeWasTagged( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $affectedDimensionSpacePoints, @@ -105,6 +106,7 @@ public function handleUntagSubtree(UntagSubtree $command, CommandHandlingDepende $events = Events::with( new SubtreeWasUntagged( + $contentGraph->getWorkspaceName(), $contentGraph->getContentStreamId(), $command->nodeAggregateId, $affectedDimensionSpacePoints, diff --git a/Neos.ContentRepository.Core/Classes/Feature/WorkspaceCommandHandler.php b/Neos.ContentRepository.Core/Classes/Feature/WorkspaceCommandHandler.php index 8114ded67e8..1e96149f95f 100644 --- a/Neos.ContentRepository.Core/Classes/Feature/WorkspaceCommandHandler.php +++ b/Neos.ContentRepository.Core/Classes/Feature/WorkspaceCommandHandler.php @@ -26,7 +26,7 @@ use Neos\ContentRepository\Core\EventStore\Events; use Neos\ContentRepository\Core\EventStore\EventsToPublish; use Neos\ContentRepository\Core\Feature\Common\MatchableWithNodeIdToPublishOrDiscardInterface; -use Neos\ContentRepository\Core\Feature\Common\PublishableToOtherContentStreamsInterface; +use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface; use Neos\ContentRepository\Core\Feature\Common\RebasableToOtherWorkspaceInterface; use Neos\ContentRepository\Core\Feature\ContentStreamClosing\Command\CloseContentStream; use Neos\ContentRepository\Core\Feature\ContentStreamClosing\Command\ReopenContentStream; @@ -241,6 +241,7 @@ private function handlePublishWorkspace( $this->publishContentStream( $workspace->currentContentStreamId, + $baseWorkspace->workspaceName, $baseWorkspace->currentContentStreamId ); @@ -276,6 +277,7 @@ private function handlePublishWorkspace( */ private function publishContentStream( ContentStreamId $contentStreamId, + WorkspaceName $baseWorkspaceName, ContentStreamId $baseContentStreamId, ): ?CommandResult { $baseWorkspaceContentStreamName = ContentStreamEventStreamName::fromContentStreamId( @@ -307,9 +309,9 @@ private function publishContentStream( ); } $contentStreamWasForkedEvent = $event; - } elseif ($event instanceof PublishableToOtherContentStreamsInterface) { + } elseif ($event instanceof PublishableToWorkspaceInterface) { /** @var EventInterface $copiedEvent */ - $copiedEvent = $event->createCopyForContentStream($baseContentStreamId); + $copiedEvent = $event->withWorkspaceNameAndContentStreamId($baseWorkspaceName, $baseContentStreamId); // We need to add the event metadata here for rebasing in nested workspace situations // (and for exporting) $events[] = DecoratedEvent::create($copiedEvent, metadata: $eventEnvelope->event->metadata, causationId: $eventEnvelope->event->causationId, correlationId: $eventEnvelope->event->correlationId); @@ -539,6 +541,7 @@ function () use ($matchingCommands, $commandHandlingDependencies, $baseWorkspace // 5) take EVENTS(MATCHING) and apply them to base WS. $this->publishContentStream( $command->contentStreamIdForMatchingPart, + $baseWorkspace->workspaceName, $baseWorkspace->currentContentStreamId ); diff --git a/Neos.ContentRepository.Export/Tests/Behavior/Features/Export/Export.feature b/Neos.ContentRepository.Export/Tests/Behavior/Features/Export/Export.feature index d2580ce81c2..6fa83209c10 100644 --- a/Neos.ContentRepository.Export/Tests/Behavior/Features/Export/Export.feature +++ b/Neos.ContentRepository.Export/Tests/Behavior/Features/Export/Export.feature @@ -24,6 +24,7 @@ Feature: As a user of the CR I want to export the event stream | nodeTypeName | "Neos.ContentRepository:Root" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "nody-mc-nodeface" | | nodeTypeName | "Neos.ContentRepository.Testing:Document" | @@ -38,7 +39,7 @@ Feature: As a user of the CR I want to export the event stream When the events are exported Then I expect the following jsonl: """ - {"identifier":"random-event-uuid","type":"RootNodeAggregateWithNodeWasCreated","payload":{"contentStreamId":"cs-identifier","nodeAggregateId":"lady-eleonode-rootford","nodeTypeName":"Neos.ContentRepository:Root","coveredDimensionSpacePoints":[{"language":"de"},{"language":"gsw"},{"language":"fr"}],"nodeAggregateClassification":"root"},"metadata":{"commandClass":"Neos\\ContentRepository\\Core\\Feature\\RootNodeCreation\\Command\\CreateRootNodeAggregateWithNode","commandPayload":{"workspaceName":"live","nodeAggregateId":"lady-eleonode-rootford","nodeTypeName":"Neos.ContentRepository:Root","tetheredDescendantNodeAggregateIds":[]},"initiatingUserId":"system","initiatingTimestamp":"random-time"}} - {"identifier":"random-event-uuid","type":"NodeAggregateWithNodeWasCreated","payload":{"contentStreamId":"cs-identifier","nodeAggregateId":"nody-mc-nodeface","nodeTypeName":"Neos.ContentRepository.Testing:Document","originDimensionSpacePoint":{"language":"de"},"succeedingSiblingsForCoverage":[{"dimensionSpacePoint":{"language":"de"},"nodeAggregateId":null},{"dimensionSpacePoint":{"language":"gsw"},"nodeAggregateId":null},{"dimensionSpacePoint":{"language":"fr"},"nodeAggregateId":null}],"parentNodeAggregateId":"lady-eleonode-rootford","nodeName":"child-document","initialPropertyValues":[],"nodeAggregateClassification":"regular"},"metadata":{"initiatingTimestamp":"random-time"}} + {"identifier":"random-event-uuid","type":"RootNodeAggregateWithNodeWasCreated","payload":{"workspaceName":"live","contentStreamId":"cs-identifier","nodeAggregateId":"lady-eleonode-rootford","nodeTypeName":"Neos.ContentRepository:Root","coveredDimensionSpacePoints":[{"language":"de"},{"language":"gsw"},{"language":"fr"}],"nodeAggregateClassification":"root"},"metadata":{"commandClass":"Neos\\ContentRepository\\Core\\Feature\\RootNodeCreation\\Command\\CreateRootNodeAggregateWithNode","commandPayload":{"workspaceName":"live","nodeAggregateId":"lady-eleonode-rootford","nodeTypeName":"Neos.ContentRepository:Root","tetheredDescendantNodeAggregateIds":[]},"initiatingUserId":"system","initiatingTimestamp":"random-time"}} + {"identifier":"random-event-uuid","type":"NodeAggregateWithNodeWasCreated","payload":{"workspaceName":"live","contentStreamId":"cs-identifier","nodeAggregateId":"nody-mc-nodeface","nodeTypeName":"Neos.ContentRepository.Testing:Document","originDimensionSpacePoint":{"language":"de"},"succeedingSiblingsForCoverage":[{"dimensionSpacePoint":{"language":"de"},"nodeAggregateId":null},{"dimensionSpacePoint":{"language":"gsw"},"nodeAggregateId":null},{"dimensionSpacePoint":{"language":"fr"},"nodeAggregateId":null}],"parentNodeAggregateId":"lady-eleonode-rootford","nodeName":"child-document","initialPropertyValues":[],"nodeAggregateClassification":"regular"},"metadata":{"initiatingTimestamp":"random-time"}} """ diff --git a/Neos.ContentRepository.Export/Tests/Behavior/Features/Import/Import.feature b/Neos.ContentRepository.Export/Tests/Behavior/Features/Import/Import.feature index 1b9e97ed65f..39a535ff64e 100644 --- a/Neos.ContentRepository.Export/Tests/Behavior/Features/Import/Import.feature +++ b/Neos.ContentRepository.Export/Tests/Behavior/Features/Import/Import.feature @@ -16,8 +16,8 @@ Feature: As a user of the CR I want to export the event stream Then I expect exactly 0 events to be published on stream with prefix "ContentStream:cs-identifier" Given using the following events.jsonl: """ - {"identifier":"9f64c281-e5b0-48d9-900b-288a8faf92a9","type":"RootNodeAggregateWithNodeWasCreated","payload":{"contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site-sites","nodeTypeName":"Neos.Neos:Sites","coveredDimensionSpacePoints":[[]],"nodeAggregateClassification":"root"},"metadata":[]} - {"identifier":"1640ebbf-7ffe-4526-b0f4-7575cefabfab","type":"NodeAggregateWithNodeWasCreated","payload":{"contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site","nodeTypeName":"Vendor.Site:HomePage","originDimensionSpacePoint":[],"succeedingSiblingsForCoverage":[{"dimensionSpacePoint":[],"nodeAggregateId":null}],"parentNodeAggregateId":"acme-site-sites","nodeName":"acme-site","initialPropertyValues":{"title":{"value":"My Site","type":"string"},"uriPathSegment":{"value":"my-site","type":"string"}},"nodeAggregateClassification":"regular"},"metadata":[]} + {"identifier":"9f64c281-e5b0-48d9-900b-288a8faf92a9","type":"RootNodeAggregateWithNodeWasCreated","payload":{"workspaceName":"workspace-name","contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site-sites","nodeTypeName":"Neos.Neos:Sites","coveredDimensionSpacePoints":[[]],"nodeAggregateClassification":"root"},"metadata":[]} + {"identifier":"1640ebbf-7ffe-4526-b0f4-7575cefabfab","type":"NodeAggregateWithNodeWasCreated","payload":{"workspaceName":"workspace-name","contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site","nodeTypeName":"Vendor.Site:HomePage","originDimensionSpacePoint":[],"succeedingSiblingsForCoverage":[{"dimensionSpacePoint":[],"nodeAggregateId":null}],"parentNodeAggregateId":"acme-site-sites","nodeName":"acme-site","initialPropertyValues":{"title":{"value":"My Site","type":"string"},"uriPathSegment":{"value":"my-site","type":"string"}},"nodeAggregateClassification":"regular"},"metadata":[]} """ And I import the events.jsonl into "cs-identifier" Then I expect exactly 3 events to be published on stream with prefix "ContentStream:cs-identifier" @@ -26,11 +26,13 @@ Feature: As a user of the CR I want to export the event stream | contentStreamId | "cs-identifier" | And event at index 1 is of type "RootNodeAggregateWithNodeWasCreated" with payload: | Key | Expected | + | workspaceName | "workspace-name" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "acme-site-sites" | | nodeTypeName | "Neos.Neos:Sites" | And event at index 2 is of type "NodeAggregateWithNodeWasCreated" with payload: | Key | Expected | + | workspaceName | "workspace-name" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "acme-site" | | nodeTypeName | "Vendor.Site:HomePage" | @@ -39,8 +41,8 @@ Feature: As a user of the CR I want to export the event stream Then I expect exactly 0 events to be published on stream with prefix "ContentStream:cs-imported-identifier" Given using the following events.jsonl: """ - {"identifier":"9f64c281-e5b0-48d9-900b-288a8faf92a9","type":"RootNodeAggregateWithNodeWasCreated","payload":{"contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site-sites","nodeTypeName":"Neos.Neos:Sites","coveredDimensionSpacePoints":[[]],"nodeAggregateClassification":"root"},"metadata":[]} - {"identifier":"1640ebbf-7ffe-4526-b0f4-7575cefabfab","type":"NodeAggregateWithNodeWasCreated","payload":{"contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site","nodeTypeName":"Vendor.Site:HomePage","originDimensionSpacePoint":[],"succeedingSiblingsForCoverage":[{"dimensionSpacePoint":[],"nodeAggregateId":null}],"parentNodeAggregateId":"acme-site-sites","nodeName":"acme-site","initialPropertyValues":{"title":{"value":"My Site","type":"string"},"uriPathSegment":{"value":"my-site","type":"string"}},"nodeAggregateClassification":"regular"},"metadata":[]} + {"identifier":"9f64c281-e5b0-48d9-900b-288a8faf92a9","type":"RootNodeAggregateWithNodeWasCreated","payload":{"workspaceName":"workspace-name","contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site-sites","nodeTypeName":"Neos.Neos:Sites","coveredDimensionSpacePoints":[[]],"nodeAggregateClassification":"root"},"metadata":[]} + {"identifier":"1640ebbf-7ffe-4526-b0f4-7575cefabfab","type":"NodeAggregateWithNodeWasCreated","payload":{"workspaceName":"workspace-name","contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site","nodeTypeName":"Vendor.Site:HomePage","originDimensionSpacePoint":[],"succeedingSiblingsForCoverage":[{"dimensionSpacePoint":[],"nodeAggregateId":null}],"parentNodeAggregateId":"acme-site-sites","nodeName":"acme-site","initialPropertyValues":{"title":{"value":"My Site","type":"string"},"uriPathSegment":{"value":"my-site","type":"string"}},"nodeAggregateClassification":"regular"},"metadata":[]} """ And I import the events.jsonl Then I expect exactly 3 events to be published on stream with prefix "ContentStream:cs-imported-identifier" @@ -49,11 +51,13 @@ Feature: As a user of the CR I want to export the event stream | contentStreamId | "cs-imported-identifier" | And event at index 1 is of type "RootNodeAggregateWithNodeWasCreated" with payload: | Key | Expected | + | workspaceName | "workspace-name" | | contentStreamId | "cs-imported-identifier" | | nodeAggregateId | "acme-site-sites" | | nodeTypeName | "Neos.Neos:Sites" | And event at index 2 is of type "NodeAggregateWithNodeWasCreated" with payload: | Key | Expected | + | workspaceName | "workspace-name" | | contentStreamId | "cs-imported-identifier" | | nodeAggregateId | "acme-site" | | nodeTypeName | "Vendor.Site:HomePage" | @@ -63,9 +67,9 @@ Feature: As a user of the CR I want to export the event stream Given using the following events.jsonl: """ - {"identifier":"5f2da12d-7037-4524-acb0-d52037342c77","type":"ContentStreamWasCreated","payload":{"contentStreamId":"cs-imported-identifier"},"metadata":[]} - {"identifier":"9f64c281-e5b0-48d9-900b-288a8faf92a9","type":"RootNodeAggregateWithNodeWasCreated","payload":{"contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site-sites","nodeTypeName":"Neos.Neos:Sites","coveredDimensionSpacePoints":[[]],"nodeAggregateClassification":"root"},"metadata":[]} - {"identifier":"1640ebbf-7ffe-4526-b0f4-7575cefabfab","type":"NodeAggregateWithNodeWasCreated","payload":{"contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site","nodeTypeName":"Vendor.Site:HomePage","originDimensionSpacePoint":[],"coveredDimensionSpacePoints":[[]],"parentNodeAggregateId":"acme-site-sites","nodeName":"acme-site","initialPropertyValues":{"title":{"value":"My Site","type":"string"},"uriPathSegment":{"value":"my-site","type":"string"}},"nodeAggregateClassification":"regular","succeedingNodeAggregateId":null},"metadata":[]} + {"identifier":"5f2da12d-7037-4524-acb0-d52037342c77","type":"ContentStreamWasCreated","payload":{"workspaceName":"workspace-name","contentStreamId":"cs-imported-identifier"},"metadata":[]} + {"identifier":"9f64c281-e5b0-48d9-900b-288a8faf92a9","type":"RootNodeAggregateWithNodeWasCreated","payload":{"workspaceName":"workspace-name","contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site-sites","nodeTypeName":"Neos.Neos:Sites","coveredDimensionSpacePoints":[[]],"nodeAggregateClassification":"root"},"metadata":[]} + {"identifier":"1640ebbf-7ffe-4526-b0f4-7575cefabfab","type":"NodeAggregateWithNodeWasCreated","payload":{"workspaceName":"workspace-name","contentStreamId":"cs-imported-identifier","nodeAggregateId":"acme-site","nodeTypeName":"Vendor.Site:HomePage","originDimensionSpacePoint":[],"coveredDimensionSpacePoints":[[]],"parentNodeAggregateId":"acme-site-sites","nodeName":"acme-site","initialPropertyValues":{"title":{"value":"My Site","type":"string"},"uriPathSegment":{"value":"my-site","type":"string"}},"nodeAggregateClassification":"regular","succeedingNodeAggregateId":null},"metadata":[]} """ And I import the events.jsonl diff --git a/Neos.ContentRepository.LegacyNodeMigration/Classes/NodeDataToEventsProcessor.php b/Neos.ContentRepository.LegacyNodeMigration/Classes/NodeDataToEventsProcessor.php index 005e12cf899..ff601dc7ab4 100644 --- a/Neos.ContentRepository.LegacyNodeMigration/Classes/NodeDataToEventsProcessor.php +++ b/Neos.ContentRepository.LegacyNodeMigration/Classes/NodeDataToEventsProcessor.php @@ -41,6 +41,7 @@ use Neos\ContentRepository\Core\SharedModel\Node\PropertyNames; use Neos\ContentRepository\Core\SharedModel\Node\ReferenceName; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; use Neos\ContentRepository\Export\Event\ValueObject\ExportedEvent; use Neos\ContentRepository\Export\ProcessorInterface; use Neos\ContentRepository\Export\ProcessorResult; @@ -62,6 +63,7 @@ final class NodeDataToEventsProcessor implements ProcessorInterface */ private array $callbacks = []; private NodeTypeName $sitesNodeTypeName; + private WorkspaceName $workspaceName; private ContentStreamId $contentStreamId; private VisitedNodeAggregates $visitedNodes; @@ -93,6 +95,7 @@ public function __construct( ) { $this->sitesNodeTypeName = NodeTypeNameFactory::forSites(); $this->contentStreamId = ContentStreamId::create(); + $this->workspaceName = WorkspaceName::forLive(); $this->visitedNodes = new VisitedNodeAggregates(); } @@ -126,7 +129,7 @@ public function run(): ProcessorResult if ($nodeDataRow['path'] === '/sites') { $sitesNodeAggregateId = NodeAggregateId::fromString($nodeDataRow['identifier']); $this->visitedNodes->addRootNode($sitesNodeAggregateId, $this->sitesNodeTypeName, NodePath::fromString('/sites'), $this->interDimensionalVariationGraph->getDimensionSpacePoints()); - $this->exportEvent(new RootNodeAggregateWithNodeWasCreated($this->contentStreamId, $sitesNodeAggregateId, $this->sitesNodeTypeName, $this->interDimensionalVariationGraph->getDimensionSpacePoints(), NodeAggregateClassification::CLASSIFICATION_ROOT)); + $this->exportEvent(new RootNodeAggregateWithNodeWasCreated($this->workspaceName, $this->contentStreamId, $sitesNodeAggregateId, $this->sitesNodeTypeName, $this->interDimensionalVariationGraph->getDimensionSpacePoints(), NodeAggregateClassification::CLASSIFICATION_ROOT)); continue; } if ($this->metaDataExported === false && $nodeDataRow['parentpath'] === '/sites') { @@ -279,6 +282,7 @@ public function processNodeDataWithoutFallbackToEmptyDimension(NodeAggregateId $ $specializations = $this->interDimensionalVariationGraph->getSpecializationSet($originDimensionSpacePoint->toDimensionSpacePoint(), true, $this->visitedNodes->alreadyVisitedOriginDimensionSpacePoints($nodeAggregateId)->toDimensionSpacePointSet()); $this->exportEvent( new NodeAggregateWithNodeWasCreated( + $this->workspaceName, $this->contentStreamId, $nodeAggregateId, $nodeTypeName, @@ -297,6 +301,7 @@ public function processNodeDataWithoutFallbackToEmptyDimension(NodeAggregateId $ // create node aggregate $this->exportEvent( new NodeAggregateWithNodeWasCreated( + $this->workspaceName, $this->contentStreamId, $nodeAggregateId, $nodeTypeName, @@ -315,10 +320,10 @@ public function processNodeDataWithoutFallbackToEmptyDimension(NodeAggregateId $ } // nodes are hidden via SubtreeWasTagged event if ($this->isNodeHidden($nodeDataRow)) { - $this->exportEvent(new SubtreeWasTagged($this->contentStreamId, $nodeAggregateId, $this->interDimensionalVariationGraph->getSpecializationSet($originDimensionSpacePoint->toDimensionSpacePoint(), true, $this->visitedNodes->alreadyVisitedOriginDimensionSpacePoints($nodeAggregateId)->toDimensionSpacePointSet()), SubtreeTag::disabled())); + $this->exportEvent(new SubtreeWasTagged($this->workspaceName, $this->contentStreamId, $nodeAggregateId, $this->interDimensionalVariationGraph->getSpecializationSet($originDimensionSpacePoint->toDimensionSpacePoint(), true, $this->visitedNodes->alreadyVisitedOriginDimensionSpacePoints($nodeAggregateId)->toDimensionSpacePointSet()), SubtreeTag::disabled())); } foreach ($serializedPropertyValuesAndReferences->references as $referencePropertyName => $destinationNodeAggregateIds) { - $this->nodeReferencesWereSetEvents[] = new NodeReferencesWereSet($this->contentStreamId, $nodeAggregateId, new OriginDimensionSpacePointSet([$originDimensionSpacePoint]), ReferenceName::fromString($referencePropertyName), SerializedNodeReferences::fromNodeAggregateIds($destinationNodeAggregateIds)); + $this->nodeReferencesWereSetEvents[] = new NodeReferencesWereSet($this->workspaceName, $this->contentStreamId, $nodeAggregateId, new OriginDimensionSpacePointSet([$originDimensionSpacePoint]), ReferenceName::fromString($referencePropertyName), SerializedNodeReferences::fromNodeAggregateIds($destinationNodeAggregateIds)); } $this->visitedNodes->add($nodeAggregateId, new DimensionSpacePointSet([$originDimensionSpacePoint->toDimensionSpacePoint()]), $nodeTypeName, $nodePath, $parentNodeAggregate->nodeAggregateId); @@ -413,6 +418,7 @@ private function createNodeVariant(NodeAggregateId $nodeAggregateId, OriginDimen $variantType = $this->interDimensionalVariationGraph->getVariantType($originDimensionSpacePoint->toDimensionSpacePoint(), $alreadyVisitedOriginDimensionSpacePoint->toDimensionSpacePoint()); $variantCreatedEvent = match ($variantType) { VariantType::TYPE_SPECIALIZATION => new NodeSpecializationVariantWasCreated( + $this->workspaceName, $this->contentStreamId, $nodeAggregateId, $alreadyVisitedOriginDimensionSpacePoint, @@ -422,6 +428,7 @@ private function createNodeVariant(NodeAggregateId $nodeAggregateId, OriginDimen ) ), VariantType::TYPE_GENERALIZATION => new NodeGeneralizationVariantWasCreated( + $this->workspaceName, $this->contentStreamId, $nodeAggregateId, $alreadyVisitedOriginDimensionSpacePoint, @@ -431,6 +438,7 @@ private function createNodeVariant(NodeAggregateId $nodeAggregateId, OriginDimen ) ), VariantType::TYPE_PEER => new NodePeerVariantWasCreated( + $this->workspaceName, $this->contentStreamId, $nodeAggregateId, $alreadyVisitedOriginDimensionSpacePoint, @@ -453,6 +461,7 @@ private function createNodeVariant(NodeAggregateId $nodeAggregateId, OriginDimen if ($serializedPropertyValuesAndReferences->serializedPropertyValues->count() > 0) { $this->exportEvent( new NodePropertiesWereSet( + $this->workspaceName, $this->contentStreamId, $nodeAggregateId, $originDimensionSpacePoint, @@ -470,6 +479,7 @@ private function createNodeVariant(NodeAggregateId $nodeAggregateId, OriginDimen !$parentNodeAggregate->nodeAggregateId->equals($nodeAggregate->getVariant($variantSourceOriginDimensionSpacePoint)->parentNodeAggregateId) ) { $this->exportEvent(new NodeAggregateWasMoved( + $this->workspaceName, $this->contentStreamId, $nodeAggregateId, $parentNodeAggregate->nodeAggregateId, diff --git a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/DisallowedChildNodeAdjustment.php b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/DisallowedChildNodeAdjustment.php index a3743176f32..8e1562ae6cf 100644 --- a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/DisallowedChildNodeAdjustment.php +++ b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/DisallowedChildNodeAdjustment.php @@ -17,6 +17,7 @@ use Neos\ContentRepository\Core\NodeType\NodeTypeName; use Neos\ContentRepository\Core\Projection\ContentGraph\NodeAggregate; use Neos\ContentRepository\Core\Projection\ContentGraph\VisibilityConstraints; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; use Neos\EventStore\Model\EventStream\ExpectedVersion; class DisallowedChildNodeAdjustment @@ -126,7 +127,8 @@ private function removeNodeInSingleDimensionSpacePoint( $referenceOrigin = OriginDimensionSpacePoint::fromDimensionSpacePoint($dimensionSpacePoint); $events = Events::with( new NodeAggregateWasRemoved( - $nodeAggregate->contentStreamId, + $this->projectedNodeIterator->contentGraph->getWorkspaceName(), + $this->projectedNodeIterator->contentGraph->getContentStreamId(), $nodeAggregate->nodeAggregateId, $nodeAggregate->occupiesDimensionSpacePoint($referenceOrigin) ? new OriginDimensionSpacePointSet([$referenceOrigin]) @@ -136,7 +138,7 @@ private function removeNodeInSingleDimensionSpacePoint( ); $streamName = ContentStreamEventStreamName::fromContentStreamId( - $nodeAggregate->contentStreamId + $this->projectedNodeIterator->contentGraph->getContentStreamId() ); return new EventsToPublish( diff --git a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/PropertyAdjustment.php b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/PropertyAdjustment.php index 1b8c9bb69de..5afde4bd653 100644 --- a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/PropertyAdjustment.php +++ b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/PropertyAdjustment.php @@ -15,6 +15,7 @@ use Neos\ContentRepository\Core\Projection\ContentGraph\Node; use Neos\ContentRepository\Core\Projection\ContentGraph\NodeAggregate; use Neos\ContentRepository\Core\SharedModel\Node\PropertyNames; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; use Neos\EventStore\Model\EventStream\ExpectedVersion; class PropertyAdjustment @@ -114,6 +115,7 @@ private function publishNodePropertiesWereSet( ): EventsToPublish { $events = Events::with( new NodePropertiesWereSet( + $node->workspaceName, $node->subgraphIdentity->contentStreamId, $node->nodeAggregateId, $node->originDimensionSpacePoint, diff --git a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/RemoveNodeAggregateTrait.php b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/RemoveNodeAggregateTrait.php index 50c06b0f01b..50d39f7e91c 100644 --- a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/RemoveNodeAggregateTrait.php +++ b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/RemoveNodeAggregateTrait.php @@ -8,16 +8,18 @@ use Neos\ContentRepository\Core\EventStore\EventsToPublish; use Neos\ContentRepository\Core\Feature\ContentStreamEventStreamName; use Neos\ContentRepository\Core\Feature\NodeRemoval\Event\NodeAggregateWasRemoved; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\NodeAggregate; use Neos\EventStore\Model\EventStream\ExpectedVersion; trait RemoveNodeAggregateTrait { - private function removeNodeAggregate(NodeAggregate $tetheredNodeAggregate): EventsToPublish + private function removeNodeAggregate(ContentGraphInterface $contentGraph, NodeAggregate $tetheredNodeAggregate): EventsToPublish { $events = Events::with( new NodeAggregateWasRemoved( - $tetheredNodeAggregate->contentStreamId, + $contentGraph->getWorkspaceName(), + $contentGraph->getContentStreamId(), $tetheredNodeAggregate->nodeAggregateId, $tetheredNodeAggregate->occupiedDimensionSpacePoints, $tetheredNodeAggregate->coveredDimensionSpacePoints, @@ -25,7 +27,7 @@ private function removeNodeAggregate(NodeAggregate $tetheredNodeAggregate): Even ); $streamName = ContentStreamEventStreamName::fromContentStreamId( - $tetheredNodeAggregate->contentStreamId + $contentGraph->getContentStreamId() ); return new EventsToPublish( $streamName->getEventStreamName(), diff --git a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/TetheredNodeAdjustments.php b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/TetheredNodeAdjustments.php index 6e0d3b1c6e5..4e617902c19 100644 --- a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/TetheredNodeAdjustments.php +++ b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/TetheredNodeAdjustments.php @@ -20,6 +20,7 @@ use Neos\ContentRepository\Core\Projection\ContentGraph\Node; use Neos\ContentRepository\Core\Projection\ContentGraph\VisibilityConstraints; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; use Neos\EventStore\Model\EventStream\ExpectedVersion; class TetheredNodeAdjustments @@ -83,7 +84,9 @@ function () use ($nodeAggregate, $originDimensionSpacePoint, $tetheredNodeTypeDe null ); - $streamName = ContentStreamEventStreamName::fromContentStreamId($nodeAggregate->contentStreamId); + $streamName = ContentStreamEventStreamName::fromContentStreamId( + $this->projectedNodeIterator->contentGraph->getContentStreamId() + ); return new EventsToPublish( $streamName->getEventStreamName(), $events, @@ -112,7 +115,7 @@ function () use ($nodeAggregate, $originDimensionSpacePoint, $tetheredNodeTypeDe 'The tethered child node "' . $tetheredNodeAggregate->nodeName->value . '" should be removed.', function () use ($tetheredNodeAggregate) { - return $this->removeNodeAggregate($tetheredNodeAggregate); + return $this->removeNodeAggregate($this->projectedNodeIterator->contentGraph, $tetheredNodeAggregate); } ); } @@ -144,7 +147,8 @@ function () use ($tetheredNodeAggregate) { . ' - actual: ' . implode(', ', array_keys($actualTetheredChildNodes)), fn () => $this->reorderNodes( - $nodeAggregate->contentStreamId, + $this->projectedNodeIterator->contentGraph->getWorkspaceName(), + $this->projectedNodeIterator->contentGraph->getContentStreamId(), $nodeAggregate->getCoverageByOccupant($originDimensionSpacePoint), $actualTetheredChildNodes, array_keys($nodeType->tetheredNodeTypeDefinitions->toArray()) @@ -201,6 +205,7 @@ protected function getPropertyConverter(): PropertyConverter * @param array $expectedNodeOrdering */ private function reorderNodes( + WorkspaceName $workspaceName, ContentStreamId $contentStreamId, DimensionSpace\DimensionSpacePointSet $coverageByOrigin, array $actualTetheredChildNodes, @@ -224,6 +229,7 @@ private function reorderNodes( } $events[] = new NodeAggregateWasMoved( + $workspaceName, $contentStreamId, $nodeToMove->nodeAggregateId, null, diff --git a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/UnknownNodeTypeAdjustment.php b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/UnknownNodeTypeAdjustment.php index 0b7d2363cf9..e2ca74e21f2 100644 --- a/Neos.ContentRepository.StructureAdjustment/src/Adjustment/UnknownNodeTypeAdjustment.php +++ b/Neos.ContentRepository.StructureAdjustment/src/Adjustment/UnknownNodeTypeAdjustment.php @@ -40,7 +40,7 @@ private function removeAllNodesOfType(NodeTypeName $nodeTypeName): \Generator 'The node type "' . $nodeTypeName->value . '" is not found; so the node should be removed (or converted)', function () use ($nodeAggregate) { - return $this->removeNodeAggregate($nodeAggregate); + return $this->removeNodeAggregate($this->projectedNodeIterator->contentGraph, $nodeAggregate); } ); } diff --git a/Neos.ContentRepositoryRegistry/Classes/Command/MigrateEventsCommandController.php b/Neos.ContentRepositoryRegistry/Classes/Command/MigrateEventsCommandController.php index 29cfcad991c..d3a5ec19d3d 100644 --- a/Neos.ContentRepositoryRegistry/Classes/Command/MigrateEventsCommandController.php +++ b/Neos.ContentRepositoryRegistry/Classes/Command/MigrateEventsCommandController.php @@ -48,4 +48,20 @@ public function migrateMetaDataToWorkspaceNameCommand(string $contentRepository $eventMigrationService = $this->contentRepositoryRegistry->buildService($contentRepositoryId, $this->eventMigrationServiceFactory); $eventMigrationService->migrateMetaDataToWorkspaceName($this->outputLine(...)); } + + /** + * Adds the "workspaceName" to the data of all content stream related events + * + * Needed for feature "Add workspaceName to relevant events": https://github.com/neos/neos-development-collection/issues/4996 + * + * Included in May 2024 - before final Neos 9.0 release + * + * @param string $contentRepository Identifier of the Content Repository to migrate + */ + public function migratePayloadToWorkspaceNameCommand(string $contentRepository = 'default'): void + { + $contentRepositoryId = ContentRepositoryId::fromString($contentRepository); + $eventMigrationService = $this->contentRepositoryRegistry->buildService($contentRepositoryId, $this->eventMigrationServiceFactory); + $eventMigrationService->migratePayloadToWorkspaceName($this->outputLine(...)); + } } diff --git a/Neos.ContentRepositoryRegistry/Classes/ContentRepositoryRegistry.php b/Neos.ContentRepositoryRegistry/Classes/ContentRepositoryRegistry.php index 4900eb13451..1fd7cc04910 100644 --- a/Neos.ContentRepositoryRegistry/Classes/ContentRepositoryRegistry.php +++ b/Neos.ContentRepositoryRegistry/Classes/ContentRepositoryRegistry.php @@ -3,6 +3,7 @@ namespace Neos\ContentRepositoryRegistry; +use Doctrine\DBAL\Connection; use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\Dimension\ContentDimensionSourceInterface; use Neos\ContentRepository\Core\Factory\ContentRepositoryFactory; diff --git a/Neos.ContentRepositoryRegistry/Classes/Service/EventMigrationService.php b/Neos.ContentRepositoryRegistry/Classes/Service/EventMigrationService.php index a22831bf7bf..f865d275860 100644 --- a/Neos.ContentRepositoryRegistry/Classes/Service/EventMigrationService.php +++ b/Neos.ContentRepositoryRegistry/Classes/Service/EventMigrationService.php @@ -1,4 +1,5 @@ eventsModified = []; $warnings = 0; @@ -101,7 +104,7 @@ public function migratePropertiesToUnset(\Closure $outputFn) // migrate payload if ($eventEnvelope->event->type->value === 'NodePropertiesWereSet') { - $eventData = json_decode($eventEnvelope->event->data->value, true); + $eventData = self::decodeEventPayload($eventEnvelope); if (isset($eventData['propertiesToUnset'])) { // is already new event type with field continue; @@ -155,7 +158,7 @@ public function migratePropertiesToUnset(\Closure $outputFn) } if ($eventEnvelope->event->type->value === 'NodeAggregateWithNodeWasCreated') { - $eventData = json_decode($eventEnvelope->event->data->value, true); + $eventData = self::decodeEventPayload($eventEnvelope); // omit null setters $propertiesWithNullValues = 0; foreach ($eventData['initialPropertyValues'] as $key => $value) { @@ -245,7 +248,7 @@ public function migratePropertiesToUnset(\Closure $outputFn) * @param \Closure $outputFn * @return void */ - public function migrateMetaDataToWorkspaceName(\Closure $outputFn) + public function migrateMetaDataToWorkspaceName(\Closure $outputFn): void { $this->eventsModified = []; @@ -312,6 +315,72 @@ public function migrateMetaDataToWorkspaceName(\Closure $outputFn) $outputFn(sprintf('Migration applied to %s events.', count($this->eventsModified))); } + /** + * Adds the "workspaceName" to the data of all content stream related events + * + * Needed for feature "Add workspaceName to relevant events": https://github.com/neos/neos-development-collection/issues/4996 + * + * Included in May 2024 - before final Neos 9.0 release + * + * @param \Closure $outputFn + * @return void + */ + public function migratePayloadToWorkspaceName(\Closure $outputFn): void + { + + $backupEventTableName = DoctrineEventStoreFactory::databaseTableName($this->contentRepositoryId) . '_bkp_' . date('Y_m_d_H_i_s'); + $outputFn('Backup: copying events table to %s', [$backupEventTableName]); + $this->copyEventTable($backupEventTableName); + + $numberOfMigratedEvents = 0; + $workspaceNamesByContentStreamId = []; + + foreach ($this->eventStore->load(VirtualStreamName::all()) as $eventEnvelope) { + $eventType = $eventEnvelope->event->type->value; + if (in_array($eventType, ['RootWorkspaceWasCreated', 'WorkspaceBaseWorkspaceWasChanged', 'WorkspaceWasCreated', 'WorkspaceWasDiscarded', 'WorkspaceWasPartiallyDiscarded', 'WorkspaceWasRebased'], true)) { + $eventData = self::decodeEventPayload($eventEnvelope); + $workspaceNamesByContentStreamId[$eventData['newContentStreamId']] = $eventData['workspaceName']; + continue; + } + if (in_array($eventType, ['WorkspaceWasPartiallyPublished', 'WorkspaceWasPublished'], true)) { + $eventData = self::decodeEventPayload($eventEnvelope); + $workspaceNamesByContentStreamId[$eventData['newSourceContentStreamId']] = $eventData['sourceWorkspaceName']; + continue; + } + if (!in_array($eventType, ['DimensionShineThroughWasAdded', 'DimensionSpacePointWasMoved', 'NodeAggregateWithNodeWasCreated', 'NodeAggregateWasDisabled', 'NodeAggregateWasEnabled', 'NodePropertiesWereSet', 'NodeAggregateWasMoved', 'NodeReferencesWereSet', 'NodeAggregateWasRemoved', 'NodeAggregateNameWasChanged', 'NodeAggregateTypeWasChanged', 'NodeGeneralizationVariantWasCreated', 'NodePeerVariantWasCreated', 'NodeSpecializationVariantWasCreated', 'RootNodeAggregateDimensionsWereUpdated', 'RootNodeAggregateWithNodeWasCreated', 'SubtreeWasTagged', 'SubtreeWasUntagged'], true)) { + continue; + } + $eventData = self::decodeEventPayload($eventEnvelope); + $workspaceName = $workspaceNamesByContentStreamId[$eventData['contentStreamId']] ?? null; + if ($workspaceName === null) { + $workspaceName = WorkspaceName::fromString('missing'); + } + $this->updateEventPayload($eventEnvelope->sequenceNumber, [...$eventData, 'workspaceName' => $workspaceName]); + $numberOfMigratedEvents++; + } + if ($numberOfMigratedEvents === 0) { + $outputFn('Migration was not necessary.'); + return; + } + + $outputFn(); + $outputFn(sprintf('Migration applied to %s events.', $numberOfMigratedEvents)); + } + + /** ------------------------ */ + + /** + * @return array + */ + private static function decodeEventPayload(EventEnvelope $eventEnvelope): array + { + try { + return json_decode($eventEnvelope->event->data->value, true, 512, JSON_THROW_ON_ERROR); + } catch (\JsonException $e) { + throw new \RuntimeException(sprintf('Failed to JSON-decode event payload of event #%d: %s', $eventEnvelope->sequenceNumber->value, $e->getMessage()), 1715951538, $e); + } + } + /** * @param array $payload */ diff --git a/Neos.Neos/Tests/Behavior/Features/FrontendRouting/DisableNodes.feature b/Neos.Neos/Tests/Behavior/Features/FrontendRouting/DisableNodes.feature index c275c47c6e9..b05e38da33d 100644 --- a/Neos.Neos/Tests/Behavior/Features/FrontendRouting/DisableNodes.feature +++ b/Neos.Neos/Tests/Behavior/Features/FrontendRouting/DisableNodes.feature @@ -145,6 +145,7 @@ Feature: Routing behavior of removed, disabled and re-enabled nodes | nodeVariantSelectionStrategy | "allVariants" | And the event SubtreeWasTagged was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | affectedDimensionSpacePoints | [{}] | @@ -171,6 +172,7 @@ Feature: Routing behavior of removed, disabled and re-enabled nodes | nodeVariantSelectionStrategy | "allVariants" | And the event SubtreeWasTagged was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "earl-o-documentbourgh" | | affectedDimensionSpacePoints | [{}] | @@ -186,6 +188,7 @@ Feature: Routing behavior of removed, disabled and re-enabled nodes | nodeVariantSelectionStrategy | "allVariants" | And the event SubtreeWasUntagged was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | affectedDimensionSpacePoints | [{}] | diff --git a/Neos.Neos/Tests/Behavior/Features/FrontendRouting/UnknownNodeTypes.feature b/Neos.Neos/Tests/Behavior/Features/FrontendRouting/UnknownNodeTypes.feature index a224340993d..2d2d5495265 100644 --- a/Neos.Neos/Tests/Behavior/Features/FrontendRouting/UnknownNodeTypes.feature +++ b/Neos.Neos/Tests/Behavior/Features/FrontendRouting/UnknownNodeTypes.feature @@ -33,6 +33,7 @@ Feature: Basic routing functionality (match & resolve nodes with unknown types) Scenario: When the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "shernode-homes" | | nodeTypeName | "Neos.Neos:Test.Routing.Page" | @@ -40,6 +41,7 @@ Feature: Basic routing functionality (match & resolve nodes with unknown types) | nodeAggregateClassification | "regular" | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "sir-david-nodenborough" | | nodeTypeName | "Neos.Neos:Test.Routing.Page" | @@ -48,6 +50,7 @@ Feature: Basic routing functionality (match & resolve nodes with unknown types) | initialPropertyValues | {"uriPathSegment": {"type": "string", "value": "david-nodenborough"}} | And the event NodeAggregateWithNodeWasCreated was published with payload: | Key | Value | + | workspaceName | "live" | | contentStreamId | "cs-identifier" | | nodeAggregateId | "unknown-nodetype" | | nodeTypeName | "Neos.Neos:Test.Routing.NonExisting" |