diff --git a/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php b/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php index 30467e9dd48..389d7a324a5 100644 --- a/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php +++ b/Neos.ContentRepository.BehavioralTests/Classes/ProjectionRaceConditionTester/RaceTrackerCatchUpHookFactory.php @@ -14,18 +14,20 @@ namespace Neos\ContentRepository\BehavioralTests\ProjectionRaceConditionTester; -use Neos\ContentRepository\Core\ContentRepository; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; /** * For full docs and context, see {@see RaceTrackerCatchUpHook} * + * @implements CatchUpHookFactoryInterface * @internal */ final class RaceTrackerCatchUpHookFactory implements CatchUpHookFactoryInterface { - public function build(ContentRepository $contentRepository): CatchUpHookInterface + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface { return new RaceTrackerCatchUpHook(); } diff --git a/Neos.ContentRepository.Core/Classes/ContentRepository.php b/Neos.ContentRepository.Core/Classes/ContentRepository.php index b6e0708ed01..bcf09a3e29c 100644 --- a/Neos.ContentRepository.Core/Classes/ContentRepository.php +++ b/Neos.ContentRepository.Core/Classes/ContentRepository.php @@ -25,6 +25,7 @@ use Neos\ContentRepository\Core\Factory\ContentRepositoryFactory; use Neos\ContentRepository\Core\NodeType\NodeTypeManager; use Neos\ContentRepository\Core\Projection\CatchUp; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpOptions; use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphProjectionInterface; @@ -143,7 +144,13 @@ public function catchUpProjection(string $projectionClassName, CatchUpOptions $o $projection = $this->projectionsAndCatchUpHooks->projections->get($projectionClassName); $catchUpHookFactory = $this->projectionsAndCatchUpHooks->getCatchUpHookFactoryForProjection($projection); - $catchUpHook = $catchUpHookFactory?->build($this); + $catchUpHook = $catchUpHookFactory?->build(new CatchUpHookFactoryDependencies( + $this->id, + $projection->getState(), + $this->nodeTypeManager, + $this->contentDimensionSource, + $this->variationGraph + )); // TODO allow custom stream name per projection $streamName = VirtualStreamName::all(); diff --git a/Neos.ContentRepository.Core/Classes/Factory/ProjectionsAndCatchUpHooksFactory.php b/Neos.ContentRepository.Core/Classes/Factory/ProjectionsAndCatchUpHooksFactory.php index cd369a87a6e..f48ed1345c0 100644 --- a/Neos.ContentRepository.Core/Classes/Factory/ProjectionsAndCatchUpHooksFactory.php +++ b/Neos.ContentRepository.Core/Classes/Factory/ProjectionsAndCatchUpHooksFactory.php @@ -6,12 +6,12 @@ use Neos\ContentRepository\Core\Projection\CatchUpHookFactories; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphProjectionInterface; use Neos\ContentRepository\Core\Projection\ProjectionFactoryInterface; use Neos\ContentRepository\Core\Projection\ProjectionInterface; use Neos\ContentRepository\Core\Projection\Projections; use Neos\ContentRepository\Core\Projection\ProjectionsAndCatchUpHooks; use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; -use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphProjectionInterface; /** * @api for custom framework integrations, not for users of the CR @@ -19,7 +19,7 @@ final class ProjectionsAndCatchUpHooksFactory { /** - * @var array>, options: array, catchUpHooksFactories: array}> + * @var array>, options: array, catchUpHooksFactories: array>}> */ private array $factories = []; @@ -40,7 +40,7 @@ public function registerFactory(ProjectionFactoryInterface $factory, array $opti /** * @param ProjectionFactoryInterface> $factory - * @param CatchUpHookFactoryInterface $catchUpHookFactory + * @param CatchUpHookFactoryInterface $catchUpHookFactory * @return void * @api */ diff --git a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php index deabf53477b..efa364124ba 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php +++ b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactories.php @@ -4,18 +4,20 @@ namespace Neos\ContentRepository\Core\Projection; -use Neos\ContentRepository\Core\ContentRepository; - /** + * @implements CatchUpHookFactoryInterface * @internal */ final class CatchUpHookFactories implements CatchUpHookFactoryInterface { /** - * @var array + * @var array> */ private array $catchUpHookFactories; + /** + * @param CatchUpHookFactoryInterface ...$catchUpHookFactories + */ private function __construct(CatchUpHookFactoryInterface ...$catchUpHookFactories) { $this->catchUpHookFactories = $catchUpHookFactories; @@ -26,6 +28,10 @@ public static function create(): self return new self(); } + /** + * @param CatchUpHookFactoryInterface $catchUpHookFactory + * @return self + */ public function with(CatchUpHookFactoryInterface $catchUpHookFactory): self { if ($this->has($catchUpHookFactory::class)) { @@ -44,9 +50,9 @@ private function has(string $catchUpHookFactoryClassName): bool return array_key_exists($catchUpHookFactoryClassName, $this->catchUpHookFactories); } - public function build(ContentRepository $contentRepository): CatchUpHookInterface + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface { - $catchUpHooks = array_map(static fn(CatchUpHookFactoryInterface $catchUpHookFactory) => $catchUpHookFactory->build($contentRepository), $this->catchUpHookFactories); + $catchUpHooks = array_map(static fn(CatchUpHookFactoryInterface $catchUpHookFactory) => $catchUpHookFactory->build($dependencies), $this->catchUpHookFactories); return new DelegatingCatchUpHook(...$catchUpHooks); } } diff --git a/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryDependencies.php b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryDependencies.php new file mode 100644 index 00000000000..037e4164150 --- /dev/null +++ b/Neos.ContentRepository.Core/Classes/Projection/CatchUpHookFactoryDependencies.php @@ -0,0 +1,41 @@ + $dependencies available dependencies to intialise the catchup hook + * @return CatchUpHookInterface + */ + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface; } diff --git a/Neos.ContentRepository.Core/Classes/Projection/ContentGraph/ContentGraphReadModelInterface.php b/Neos.ContentRepository.Core/Classes/Projection/ContentGraph/ContentGraphReadModelInterface.php index 58232977141..090d3320196 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/ContentGraph/ContentGraphReadModelInterface.php +++ b/Neos.ContentRepository.Core/Classes/Projection/ContentGraph/ContentGraphReadModelInterface.php @@ -23,7 +23,11 @@ use Neos\ContentRepository\Core\SharedModel\Workspace\Workspaces; /** - * @api for creating a custom content repository graph projection implementation, **not for users of the CR** + * This low level interface gives access to the content graph and workspaces + * + * Generally this is not accessible for users of the CR, except for registering a catchup-hook on the content graph + * + * @api as dependency in catchup hooks and for creating a custom content repository graph projection implementation */ interface ContentGraphReadModelInterface extends ProjectionStateInterface { diff --git a/Neos.ContentRepository.Core/Classes/Projection/ProjectionsAndCatchUpHooks.php b/Neos.ContentRepository.Core/Classes/Projection/ProjectionsAndCatchUpHooks.php index 255e59b7600..d7b674babdb 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/ProjectionsAndCatchUpHooks.php +++ b/Neos.ContentRepository.Core/Classes/Projection/ProjectionsAndCatchUpHooks.php @@ -26,6 +26,7 @@ public function __construct( /** * @param ProjectionInterface $projection + * @return ?CatchUpHookFactoryInterface */ public function getCatchUpHookFactoryForProjection(ProjectionInterface $projection): ?CatchUpHookFactoryInterface { diff --git a/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php b/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php index f31545386b3..cebe03ebb43 100644 --- a/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php +++ b/Neos.ContentRepositoryRegistry/Classes/SubgraphCachingInMemory/FlushSubgraphCachePoolCatchUpHookFactory.php @@ -4,13 +4,15 @@ namespace Neos\ContentRepositoryRegistry\SubgraphCachingInMemory; -use Neos\ContentRepository\Core\ContentRepository; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; /** * Factory for {@see FlushSubgraphCachePoolCatchUpHook}, auto-registered in Settings.yaml for GraphProjection * + * @implements CatchUpHookFactoryInterface * @internal */ class FlushSubgraphCachePoolCatchUpHookFactory implements CatchUpHookFactoryInterface @@ -20,7 +22,8 @@ public function __construct( private readonly SubgraphCachePool $subgraphCachePool ) { } - public function build(ContentRepository $contentRepository): CatchUpHookInterface + + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface { return new FlushSubgraphCachePoolCatchUpHook($this->subgraphCachePool); } diff --git a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHook.php b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHook.php index 97b970ba6cc..e52b55bb99c 100644 --- a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHook.php +++ b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHook.php @@ -4,7 +4,6 @@ namespace Neos\Neos\AssetUsage\CatchUpHook; -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePoint; use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet; use Neos\ContentRepository\Core\EventStore\EventInterface; @@ -21,9 +20,11 @@ use Neos\ContentRepository\Core\Feature\WorkspacePublication\Event\WorkspaceWasDiscarded; use Neos\ContentRepository\Core\Feature\WorkspacePublication\Event\WorkspaceWasPartiallyDiscarded; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\Filter\FindDescendantNodesFilter; use Neos\ContentRepository\Core\Projection\ContentGraph\Node; use Neos\ContentRepository\Core\Projection\ContentGraph\VisibilityConstraints; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceDoesNotExist; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; @@ -36,7 +37,8 @@ class AssetUsageCatchUpHook implements CatchUpHookInterface { public function __construct( - private readonly ContentRepository $contentRepository, + private readonly ContentRepositoryId $contentRepositoryId, + private readonly ContentGraphReadModelInterface $contentGraphReadModel, private readonly AssetUsageIndexingService $assetUsageIndexingService ) { } @@ -50,7 +52,7 @@ public function onBeforeEvent(EventInterface $eventInstance, EventEnvelope $even if ($eventInstance instanceof EmbedsWorkspaceName) { try { // Skip if the workspace does not exist: "The source workspace missing does not exist" https://github.com/neos/neos-development-collection/pull/5270 - $this->contentRepository->getContentGraph($eventInstance->getWorkspaceName()); + $this->contentGraphReadModel->getContentGraph($eventInstance->getWorkspaceName()); } catch (WorkspaceDoesNotExist) { return; } @@ -68,7 +70,7 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event if ($eventInstance instanceof EmbedsWorkspaceName) { try { // Skip if the workspace does not exist: "The source workspace missing does not exist" https://github.com/neos/neos-development-collection/pull/5270 - $this->contentRepository->getContentGraph($eventInstance->getWorkspaceName()); + $this->contentGraphReadModel->getContentGraph($eventInstance->getWorkspaceName()); } catch (WorkspaceDoesNotExist) { return; } @@ -97,7 +99,7 @@ public function onAfterCatchUp(): void private function updateNode(WorkspaceName $workspaceName, NodeAggregateId $nodeAggregateId, DimensionSpacePoint $dimensionSpacePoint): void { - $contentGraph = $this->contentRepository->getContentGraph($workspaceName); + $contentGraph = $this->contentGraphReadModel->getContentGraph($workspaceName); $node = $contentGraph->getSubgraph($dimensionSpacePoint, VisibilityConstraints::withoutRestrictions())->findNodeById($nodeAggregateId); if ($node === null) { @@ -106,14 +108,14 @@ private function updateNode(WorkspaceName $workspaceName, NodeAggregateId $nodeA } $this->assetUsageIndexingService->updateIndex( - $this->contentRepository->id, + $this->contentRepositoryId, $node ); } private function removeNodes(WorkspaceName $workspaceName, NodeAggregateId $nodeAggregateId, DimensionSpacePointSet $dimensionSpacePoints): void { - $contentGraph = $this->contentRepository->getContentGraph($workspaceName); + $contentGraph = $this->contentGraphReadModel->getContentGraph($workspaceName); foreach ($dimensionSpacePoints as $dimensionSpacePoint) { $subgraph = $contentGraph->getSubgraph($dimensionSpacePoint, VisibilityConstraints::withoutRestrictions()); @@ -125,7 +127,7 @@ private function removeNodes(WorkspaceName $workspaceName, NodeAggregateId $node /** @var Node $node */ foreach ($nodes as $node) { $this->assetUsageIndexingService->removeIndexForNode( - $this->contentRepository->id, + $this->contentRepositoryId, $node ); } @@ -134,7 +136,7 @@ private function removeNodes(WorkspaceName $workspaceName, NodeAggregateId $node private function discardWorkspace(WorkspaceName $workspaceName): void { - $this->assetUsageIndexingService->removeIndexForWorkspace($this->contentRepository->id, $workspaceName); + $this->assetUsageIndexingService->removeIndexForWorkspace($this->contentRepositoryId, $workspaceName); } private function discardNodes(WorkspaceName $workspaceName, NodeIdsToPublishOrDiscard $nodeIds): void @@ -145,7 +147,7 @@ private function discardNodes(WorkspaceName $workspaceName, NodeIdsToPublishOrDi continue; } $this->assetUsageIndexingService->removeIndexForWorkspaceNameNodeAggregateIdAndDimensionSpacePoint( - $this->contentRepository->id, + $this->contentRepositoryId, $workspaceName, $nodeId->nodeAggregateId, $nodeId->dimensionSpacePoint @@ -155,6 +157,6 @@ private function discardNodes(WorkspaceName $workspaceName, NodeIdsToPublishOrDi private function updateDimensionSpacePoint(WorkspaceName $workspaceName, DimensionSpacePoint $source, DimensionSpacePoint $target): void { - $this->assetUsageIndexingService->updateDimensionSpacePointInIndex($this->contentRepository->id, $workspaceName, $source, $target); + $this->assetUsageIndexingService->updateDimensionSpacePointInIndex($this->contentRepositoryId, $workspaceName, $source, $target); } } diff --git a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php index 89bcec32e86..4188a10072f 100644 --- a/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php +++ b/Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHookFactory.php @@ -14,10 +14,14 @@ * source code. */ -use Neos\ContentRepository\Core\ContentRepository; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; use Neos\Neos\AssetUsage\Service\AssetUsageIndexingService; +/** + * @implements CatchUpHookFactoryInterface + */ class AssetUsageCatchUpHookFactory implements CatchUpHookFactoryInterface { public function __construct( @@ -25,10 +29,11 @@ public function __construct( ) { } - public function build(ContentRepository $contentRepository): AssetUsageCatchUpHook + public function build(CatchUpHookFactoryDependencies $dependencies): AssetUsageCatchUpHook { return new AssetUsageCatchUpHook( - $contentRepository, + $dependencies->contentRepositoryId, + $dependencies->projectionState, $this->assetUsageIndexingService ); } diff --git a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHook.php b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHook.php index b6529d5be4c..1dc70d4fac7 100644 --- a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHook.php +++ b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHook.php @@ -4,7 +4,6 @@ namespace Neos\Neos\FrontendRouting\CatchUpHook; -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePoint; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\NodeModification\Event\NodePropertiesWereSet; @@ -28,7 +27,7 @@ final class RouterCacheHook implements CatchUpHookInterface private array $tagsToFlush = []; public function __construct( - private readonly ContentRepository $contentRepository, + private readonly DocumentUriPathFinder $documentUriPathFinder, private readonly RouterCachingService $routerCachingService, ) { } @@ -85,7 +84,7 @@ private function onBeforeSubtreeWasTagged(SubtreeWasTagged $event): void $this->collectTagsToFlush($node); - $descendantsOfNode = $this->getState()->getDescendantsOfNode($node); + $descendantsOfNode = $this->documentUriPathFinder->getDescendantsOfNode($node); array_map($this->collectTagsToFlush(...), iterator_to_array($descendantsOfNode)); } } @@ -105,7 +104,7 @@ private function onBeforeNodeAggregateWasRemoved(NodeAggregateWasRemoved $event) $this->collectTagsToFlush($node); - $descendantsOfNode = $this->getState()->getDescendantsOfNode($node); + $descendantsOfNode = $this->documentUriPathFinder->getDescendantsOfNode($node); array_map($this->collectTagsToFlush(...), iterator_to_array($descendantsOfNode)); } } @@ -130,7 +129,7 @@ private function onBeforeNodePropertiesWereSet(NodePropertiesWereSet $event): vo $this->collectTagsToFlush($node); - $descendantsOfNode = $this->getState()->getDescendantsOfNode($node); + $descendantsOfNode = $this->documentUriPathFinder->getDescendantsOfNode($node); array_map($this->collectTagsToFlush(...), iterator_to_array($descendantsOfNode)); } } @@ -153,7 +152,7 @@ private function onBeforeNodeAggregateWasMoved(NodeAggregateWasMoved $event): vo $this->collectTagsToFlush($node); - $descendantsOfNode = $this->getState()->getDescendantsOfNode($node); + $descendantsOfNode = $this->documentUriPathFinder->getDescendantsOfNode($node); array_map($this->collectTagsToFlush(...), iterator_to_array($descendantsOfNode)); } } @@ -173,15 +172,10 @@ private function flushAllCollectedTags(): void $this->tagsToFlush = []; } - private function getState(): DocumentUriPathFinder - { - return $this->contentRepository->projectionState(DocumentUriPathFinder::class); - } - private function findDocumentNodeInfoByIdAndDimensionSpacePoint(NodeAggregateId $nodeAggregateId, DimensionSpacePoint $dimensionSpacePoint): ?DocumentNodeInfo { try { - return $this->getState()->getByIdAndDimensionSpacePointHash( + return $this->documentUriPathFinder->getByIdAndDimensionSpacePointHash( $nodeAggregateId, $dimensionSpacePoint->hash ); diff --git a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php index 15b92e86c39..cbdd469d930 100644 --- a/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php +++ b/Neos.Neos/Classes/FrontendRouting/CatchUpHook/RouterCacheHookFactory.php @@ -4,12 +4,15 @@ namespace Neos\Neos\FrontendRouting\CatchUpHook; -use Neos\ContentRepository\Core\ContentRepository; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; use Neos\Flow\Mvc\Routing\RouterCachingService; -use Neos\RedirectHandler\NeosAdapter\Service\NodeRedirectService; +use Neos\Neos\FrontendRouting\Projection\DocumentUriPathFinder; +/** + * @implements CatchUpHookFactoryInterface + */ final class RouterCacheHookFactory implements CatchUpHookFactoryInterface { public function __construct( @@ -17,10 +20,10 @@ public function __construct( ) { } - public function build(ContentRepository $contentRepository): CatchUpHookInterface + public function build(CatchUpHookFactoryDependencies $dependencies): CatchUpHookInterface { return new RouterCacheHook( - $contentRepository, + $dependencies->projectionState, $this->routerCachingService ); } diff --git a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushing.php b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushing.php index 19ffd145d04..349d4eb3ac7 100644 --- a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushing.php +++ b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushing.php @@ -14,7 +14,6 @@ * source code. */ -use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\EventStore\EventInterface; use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamId; use Neos\ContentRepository\Core\Feature\Common\EmbedsNodeAggregateId; @@ -37,7 +36,9 @@ use Neos\ContentRepository\Core\Feature\WorkspacePublication\Event\WorkspaceWasPartiallyDiscarded; use Neos\ContentRepository\Core\Feature\WorkspaceRebase\Event\WorkspaceWasRebased; use Neos\ContentRepository\Core\Projection\CatchUpHookInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\NodeAggregate; +use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceDoesNotExist; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateIds; @@ -107,7 +108,8 @@ public static function disabled(\Closure $fn): void public function __construct( - private readonly ContentRepository $contentRepository, + private readonly ContentRepositoryId $contentRepositoryId, + private readonly ContentGraphReadModelInterface $contentGraphReadModel, private readonly ContentCacheFlusher $contentCacheFlusher ) { } @@ -159,7 +161,7 @@ public function onBeforeEvent(EventInterface $eventInstance, EventEnvelope $even || $eventInstance instanceof NodeAggregateWasMoved ) { try { - $contentGraph = $this->contentRepository->getContentGraph($eventInstance->workspaceName); + $contentGraph = $this->contentGraphReadModel->getContentGraph($eventInstance->workspaceName); } catch (WorkspaceDoesNotExist) { return; } @@ -169,7 +171,7 @@ public function onBeforeEvent(EventInterface $eventInstance, EventEnvelope $even ); if ($nodeAggregate) { $this->scheduleCacheFlushJobForNodeAggregate( - $this->contentRepository, + $this->contentRepositoryId, $eventInstance->workspaceName, $nodeAggregate ); @@ -194,7 +196,7 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event || $eventInstance instanceof WorkspaceWasPartiallyDiscarded || $eventInstance instanceof WorkspaceWasRebased ) { - $this->scheduleCacheFlushJobForWorkspaceName($this->contentRepository, $eventInstance->workspaceName); + $this->scheduleCacheFlushJobForWorkspaceName($this->contentRepositoryId, $eventInstance->workspaceName); } elseif ( !($eventInstance instanceof NodeAggregateWasRemoved) && $eventInstance instanceof EmbedsNodeAggregateId @@ -202,7 +204,7 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event && $eventInstance instanceof EmbedsWorkspaceName ) { try { - $nodeAggregate = $this->contentRepository->getContentGraph($eventInstance->getWorkspaceName())->findNodeAggregateById( + $nodeAggregate = $this->contentGraphReadModel->getContentGraph($eventInstance->getWorkspaceName())->findNodeAggregateById( $eventInstance->getNodeAggregateId() ); } catch (WorkspaceDoesNotExist) { @@ -211,7 +213,7 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event if ($nodeAggregate) { $this->scheduleCacheFlushJobForNodeAggregate( - $this->contentRepository, + $this->contentRepositoryId, $eventInstance->getWorkspaceName(), $nodeAggregate ); @@ -220,13 +222,13 @@ public function onAfterEvent(EventInterface $eventInstance, EventEnvelope $event } private function scheduleCacheFlushJobForNodeAggregate( - ContentRepository $contentRepository, + ContentRepositoryId $contentRepositoryId, WorkspaceName $workspaceName, NodeAggregate $nodeAggregate ): void { // we store this in an associative array deduplicate. $this->flushNodeAggregateRequestsOnAfterCatchUp[$workspaceName->value . '__' . $nodeAggregate->nodeAggregateId->value] = FlushNodeAggregateRequest::create( - $contentRepository->id, + $contentRepositoryId, $workspaceName, $nodeAggregate->nodeAggregateId, $nodeAggregate->nodeTypeName, @@ -235,19 +237,19 @@ private function scheduleCacheFlushJobForNodeAggregate( } private function scheduleCacheFlushJobForWorkspaceName( - ContentRepository $contentRepository, + ContentRepositoryId $contentRepositoryId, WorkspaceName $workspaceName ): void { // we store this in an associative array deduplicate. $this->flushWorkspaceRequestsOnAfterCatchUp[$workspaceName->value] = FlushWorkspaceRequest::create( - $contentRepository->id, + $contentRepositoryId, $workspaceName, ); } private function determineAncestorNodeAggregateIds(WorkspaceName $workspaceName, NodeAggregateId $childNodeAggregateId): NodeAggregateIds { - $contentGraph = $this->contentRepository->getContentGraph($workspaceName); + $contentGraph = $this->contentGraphReadModel->getContentGraph($workspaceName); $stack = iterator_to_array($contentGraph->findParentNodeAggregates($childNodeAggregateId)); $ancestorNodeAggregateIds = []; diff --git a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php index 62e8c499008..a988f1bcac6 100644 --- a/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php +++ b/Neos.Neos/Classes/Fusion/Cache/GraphProjectorCatchUpHookForCacheFlushingFactory.php @@ -14,9 +14,13 @@ * source code. */ -use Neos\ContentRepository\Core\ContentRepository; +use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryDependencies; use Neos\ContentRepository\Core\Projection\CatchUpHookFactoryInterface; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphReadModelInterface; +/** + * @implements CatchUpHookFactoryInterface + */ class GraphProjectorCatchUpHookForCacheFlushingFactory implements CatchUpHookFactoryInterface { public function __construct( @@ -24,10 +28,11 @@ public function __construct( ) { } - public function build(ContentRepository $contentRepository): GraphProjectorCatchUpHookForCacheFlushing + public function build(CatchUpHookFactoryDependencies $dependencies): GraphProjectorCatchUpHookForCacheFlushing { return new GraphProjectorCatchUpHookForCacheFlushing( - $contentRepository, + $dependencies->contentRepositoryId, + $dependencies->projectionState, $this->contentCacheFlusher ); } diff --git a/Neos.Neos/Documentation/References/CommandReference.rst b/Neos.Neos/Documentation/References/CommandReference.rst index d29bcf602fb..beaa86ac5dc 100644 --- a/Neos.Neos/Documentation/References/CommandReference.rst +++ b/Neos.Neos/Documentation/References/CommandReference.rst @@ -19,7 +19,7 @@ commands that may be available, use:: ./flow help -The following reference was automatically generated from code on 2024-11-01 +The following reference was automatically generated from code on 2024-11-04 .. _`Neos Command Reference: NEOS.FLOW`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/FluidAdaptor.rst b/Neos.Neos/Documentation/References/ViewHelpers/FluidAdaptor.rst index 2bbdacda300..ab86c36bdb5 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/FluidAdaptor.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/FluidAdaptor.rst @@ -3,7 +3,7 @@ FluidAdaptor ViewHelper Reference ################################# -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`FluidAdaptor ViewHelper Reference: f:debug`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/Form.rst b/Neos.Neos/Documentation/References/ViewHelpers/Form.rst index 19f37c00268..f4cb783d1b7 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/Form.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/Form.rst @@ -3,7 +3,7 @@ Form ViewHelper Reference ######################### -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`Form ViewHelper Reference: neos.form:form`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/Media.rst b/Neos.Neos/Documentation/References/ViewHelpers/Media.rst index ed563bd61a3..aa9c60fdc2d 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/Media.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/Media.rst @@ -3,7 +3,7 @@ Media ViewHelper Reference ########################## -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`Media ViewHelper Reference: neos.media:fileTypeIcon`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/Neos.rst b/Neos.Neos/Documentation/References/ViewHelpers/Neos.rst index b0fa029530a..7f6f36a8242 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/Neos.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/Neos.rst @@ -3,7 +3,7 @@ Neos ViewHelper Reference ######################### -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`Neos ViewHelper Reference: neos:backend.authenticationProviderLabel`: diff --git a/Neos.Neos/Documentation/References/ViewHelpers/TYPO3Fluid.rst b/Neos.Neos/Documentation/References/ViewHelpers/TYPO3Fluid.rst index 7e37fc3a530..2e67bf7f29c 100644 --- a/Neos.Neos/Documentation/References/ViewHelpers/TYPO3Fluid.rst +++ b/Neos.Neos/Documentation/References/ViewHelpers/TYPO3Fluid.rst @@ -3,7 +3,7 @@ TYPO3 Fluid ViewHelper Reference ################################ -This reference was automatically generated from code on 2024-11-01 +This reference was automatically generated from code on 2024-11-04 .. _`TYPO3 Fluid ViewHelper Reference: f:alias`: