From f15eabc2bffe7a4d52abba9b05339cc5f13237f6 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:00:14 +0200 Subject: [PATCH] TASK: Deprecate `WorkspaceFinder` and introduce forward-compatible API Based on https://github.com/neos/neos-development-collection/pull/5146 Required to ease migration to https://github.com/neos/neos-development-collection/pull/5096 --- .../Classes/ContentRepository.php | 25 ++++++++++++--- .../Projection/Workspace/Workspace.php | 5 +++ .../Projection/Workspace/WorkspaceFinder.php | 31 +++++++++++++++++-- .../Projection/Workspace/Workspaces.php | 26 ++++++++++++++++ 4 files changed, 79 insertions(+), 8 deletions(-) diff --git a/Neos.ContentRepository.Core/Classes/ContentRepository.php b/Neos.ContentRepository.Core/Classes/ContentRepository.php index 955cf80fe26..e824402d322 100644 --- a/Neos.ContentRepository.Core/Classes/ContentRepository.php +++ b/Neos.ContentRepository.Core/Classes/ContentRepository.php @@ -36,7 +36,9 @@ use Neos\ContentRepository\Core\Projection\ProjectionStateInterface; use Neos\ContentRepository\Core\Projection\ProjectionStatuses; use Neos\ContentRepository\Core\Projection\WithMarkStaleInterface; +use Neos\ContentRepository\Core\Projection\Workspace\Workspace; use Neos\ContentRepository\Core\Projection\Workspace\WorkspaceFinder; +use Neos\ContentRepository\Core\Projection\Workspace\Workspaces; use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId; use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryStatus; use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceDoesNotExist; @@ -234,11 +236,6 @@ public function resetProjectionState(string $projectionClassName): void $projection->reset(); } - public function getNodeTypeManager(): NodeTypeManager - { - return $this->nodeTypeManager; - } - /** * @throws WorkspaceDoesNotExist if the workspace does not exist */ @@ -247,6 +244,19 @@ public function getContentGraph(WorkspaceName $workspaceName): ContentGraphInter return $this->projectionState(ContentGraphFinder::class)->getByWorkspaceName($workspaceName); } + public function findWorkspaceByName(WorkspaceName $workspaceName): ?Workspace + { + return $this->getWorkspaceFinder()->findOneByName($workspaceName); + } + + public function getWorkspaces(): Workspaces + { + return $this->getWorkspaceFinder()->findAll(); + } + + /** + * @deprecated with 9.0.0-beta14 please use {@see ContentRepository::getWorkspaces()} and {@see ContentRepository::findWorkspaceByName()} instead. + */ public function getWorkspaceFinder(): WorkspaceFinder { return $this->projectionState(WorkspaceFinder::class); @@ -257,6 +267,11 @@ public function getContentStreamFinder(): ContentStreamFinder return $this->projectionState(ContentStreamFinder::class); } + public function getNodeTypeManager(): NodeTypeManager + { + return $this->nodeTypeManager; + } + public function getVariationGraph(): InterDimensionalVariationGraph { return $this->variationGraph; diff --git a/Neos.ContentRepository.Core/Classes/Projection/Workspace/Workspace.php b/Neos.ContentRepository.Core/Classes/Projection/Workspace/Workspace.php index ddb826aff52..ff339ca5acc 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/Workspace/Workspace.php +++ b/Neos.ContentRepository.Core/Classes/Projection/Workspace/Workspace.php @@ -129,4 +129,9 @@ public function isPublicWorkspace(): bool { return $this->baseWorkspaceName === null && $this->workspaceOwner === null; } + + public function isRootWorkspace(): bool + { + return $this->baseWorkspaceName !== null; + } } diff --git a/Neos.ContentRepository.Core/Classes/Projection/Workspace/WorkspaceFinder.php b/Neos.ContentRepository.Core/Classes/Projection/Workspace/WorkspaceFinder.php index bd87127f8d7..664d18a2bb0 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/Workspace/WorkspaceFinder.php +++ b/Neos.ContentRepository.Core/Classes/Projection/Workspace/WorkspaceFinder.php @@ -23,9 +23,10 @@ use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceTitle; /** - * Workspace Finder + * The legacy Workspace Finder * - * @api + * @deprecated with 9.0.0-beta14 please use {@see ContentRepository::getWorkspaces()} and {@see ContentRepository::findWorkspaceByName()} instead. + * @internal */ final class WorkspaceFinder implements ProjectionStateInterface { @@ -36,7 +37,9 @@ public function __construct( ) { } - + /** + * @deprecated with 9.0.0-beta14 please use {@see ContentRepository::findWorkspaceByName()} instead + */ public function findOneByName(WorkspaceName $name): ?Workspace { $workspace = $this->workspaceRuntimeCache->getWorkspaceByName($name); @@ -63,6 +66,15 @@ public function findOneByName(WorkspaceName $name): ?Workspace return $workspace; } + /** + * @deprecated with 9.0.0-beta14 discouraged. You should just operate on workspace names instead. + * To still archive the functionality please use {@see ContentRepository::getWorkspaces()} instead and filter the result: + * + * $this->contentRepository->getWorkspaces()->find( + * fn (Workspace $workspace) => $workspace->currentContentStreamId->equals($contentStreamId) + * ) + * + */ public function findOneByCurrentContentStreamId( ContentStreamId $contentStreamId ): ?Workspace { @@ -91,6 +103,7 @@ public function findOneByCurrentContentStreamId( } /** + * @deprecated with 9.0.0-beta14 please use {@see ContentRepository::getWorkspaces()} and {@see Workspaces::getBaseWorkspaces()} instead. * @return array * @throws DBALException */ @@ -116,6 +129,9 @@ public function findByBaseWorkspace(WorkspaceName $baseWorkspace): array return $result; } + /** + * @deprecated with 9.0.0-beta14 owners/collaborators should be assigned to workspaces outside the Content Repository core + */ public function findOneByWorkspaceOwner(string $owner): ?Workspace { $workspaceRow = $this->dbal->executeQuery( @@ -135,6 +151,9 @@ public function findOneByWorkspaceOwner(string $owner): ?Workspace return $this->createWorkspaceFromDatabaseRow($workspaceRow); } + /** + * @deprecated with 9.0.0-beta14 please use {@see ContentRepository::getWorkspaces()} instead + */ public function findAll(): Workspaces { $result = []; @@ -154,6 +173,12 @@ public function findAll(): Workspaces } /** + * @deprecated with 9.0.0-beta14 please use {@see ContentRepository::getWorkspaces()} instead and filter the result: + * + * $this->contentRepository->getWorkspaces()->filter( + * fn (Workspace $workspace) => $workspace->status === WorkspaceStatus::OUTDATED + * ) + * * @return array * @throws \Doctrine\DBAL\Driver\Exception * @throws DBALException diff --git a/Neos.ContentRepository.Core/Classes/Projection/Workspace/Workspaces.php b/Neos.ContentRepository.Core/Classes/Projection/Workspace/Workspaces.php index f8fea6db6db..816de4847d8 100644 --- a/Neos.ContentRepository.Core/Classes/Projection/Workspace/Workspaces.php +++ b/Neos.ContentRepository.Core/Classes/Projection/Workspace/Workspaces.php @@ -100,8 +100,34 @@ public function getIterator(): \Traversable yield from array_values($this->workspaces); } + /** + * @param \Closure(Workspace): bool $callback + */ + public function filter(\Closure $callback): self + { + return new self(array_filter($this->workspaces, $callback)); + } + + /** + * @param \Closure(Workspace): bool $callback + */ + public function find(\Closure $callback): ?Workspace + { + foreach ($this->workspaces as $workspace) { + if ($callback($workspace)) { + return $workspace; + } + } + return null; + } + public function count(): int { return count($this->workspaces); } + + public function isEmpty(): bool + { + return $this->workspaces === []; + } }