Skip to content

TASK: Use proper version checks for workspace events #5488

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: 9.0
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ private function getBasicWorkspaceQuery(): QueryBuilder
$queryBuilder = $this->dbal->createQueryBuilder();

return $queryBuilder
->select('ws.name, ws.baseWorkspaceName, ws.currentContentStreamId, cs.hasChanges, cs.sourceContentStreamVersion = scs.version as upToDateWithBase')
->select('ws.name, ws.baseWorkspaceName, ws.currentContentStreamId, cs.hasChanges, cs.sourceContentStreamVersion = scs.version as upToDateWithBase, ws.version')
->from($this->tableNames->workspace(), 'ws')
->join('ws', $this->tableNames->contentStream(), 'cs', 'cs.id = ws.currentcontentstreamid')
->leftJoin('cs', $this->tableNames->contentStream(), 'scs', 'scs.id = cs.sourceContentStreamId');
Expand Down Expand Up @@ -174,6 +174,7 @@ private static function workspaceFromDatabaseRow(array $row): Workspace
$baseWorkspaceName === null
? false
: (bool)$row['hasChanges'],
Version::fromInteger((int)$row['version']),
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,15 +161,15 @@ public function apply(EventInterface $event, EventEnvelope $eventEnvelope): void
NodeSpecializationVariantWasCreated::class => $this->whenNodeSpecializationVariantWasCreated($event, $eventEnvelope),
RootNodeAggregateDimensionsWereUpdated::class => $this->whenRootNodeAggregateDimensionsWereUpdated($event),
RootNodeAggregateWithNodeWasCreated::class => $this->whenRootNodeAggregateWithNodeWasCreated($event, $eventEnvelope),
RootWorkspaceWasCreated::class => $this->whenRootWorkspaceWasCreated($event),
RootWorkspaceWasCreated::class => $this->whenRootWorkspaceWasCreated($event, $eventEnvelope),
SubtreeWasTagged::class => $this->whenSubtreeWasTagged($event),
SubtreeWasUntagged::class => $this->whenSubtreeWasUntagged($event),
WorkspaceBaseWorkspaceWasChanged::class => $this->whenWorkspaceBaseWorkspaceWasChanged($event),
WorkspaceBaseWorkspaceWasChanged::class => $this->whenWorkspaceBaseWorkspaceWasChanged($event, $eventEnvelope),
WorkspaceRebaseFailed::class => $this->whenWorkspaceRebaseFailed($event),
WorkspaceWasCreated::class => $this->whenWorkspaceWasCreated($event),
WorkspaceWasDiscarded::class => $this->whenWorkspaceWasDiscarded($event),
WorkspaceWasPublished::class => $this->whenWorkspaceWasPublished($event),
WorkspaceWasRebased::class => $this->whenWorkspaceWasRebased($event),
WorkspaceWasCreated::class => $this->whenWorkspaceWasCreated($event, $eventEnvelope),
WorkspaceWasDiscarded::class => $this->whenWorkspaceWasDiscarded($event, $eventEnvelope),
WorkspaceWasPublished::class => $this->whenWorkspaceWasPublished($event, $eventEnvelope),
WorkspaceWasRebased::class => $this->whenWorkspaceWasRebased($event, $eventEnvelope),
WorkspaceWasRemoved::class => $this->whenWorkspaceWasRemoved($event),
default => null,
};
Expand Down Expand Up @@ -668,9 +668,9 @@ private function whenRootNodeAggregateWithNodeWasCreated(RootNodeAggregateWithNo
);
}

private function whenRootWorkspaceWasCreated(RootWorkspaceWasCreated $event): void
private function whenRootWorkspaceWasCreated(RootWorkspaceWasCreated $event, EventEnvelope $eventEnvelope): void
{
$this->createWorkspace($event->workspaceName, null, $event->newContentStreamId);
$this->createWorkspace($event->workspaceName, null, $event->newContentStreamId, $eventEnvelope->version);
}

private function whenSubtreeWasTagged(SubtreeWasTagged $event): void
Expand All @@ -683,9 +683,9 @@ private function whenSubtreeWasUntagged(SubtreeWasUntagged $event): void
$this->removeSubtreeTag($event->contentStreamId, $event->nodeAggregateId, $event->affectedDimensionSpacePoints, $event->tag);
}

private function whenWorkspaceBaseWorkspaceWasChanged(WorkspaceBaseWorkspaceWasChanged $event): void
private function whenWorkspaceBaseWorkspaceWasChanged(WorkspaceBaseWorkspaceWasChanged $event, EventEnvelope $eventEnvelope): void
{
$this->updateBaseWorkspace($event->workspaceName, $event->baseWorkspaceName, $event->newContentStreamId);
$this->updateBaseWorkspace($event->workspaceName, $event->baseWorkspaceName, $event->newContentStreamId, $eventEnvelope->version);
}

private function whenWorkspaceRebaseFailed(WorkspaceRebaseFailed $event): void
Expand All @@ -697,24 +697,24 @@ private function whenWorkspaceRebaseFailed(WorkspaceRebaseFailed $event): void
$this->reopenContentStream($event->sourceContentStreamId);
}

private function whenWorkspaceWasCreated(WorkspaceWasCreated $event): void
private function whenWorkspaceWasCreated(WorkspaceWasCreated $event, EventEnvelope $eventEnvelope): void
{
$this->createWorkspace($event->workspaceName, $event->baseWorkspaceName, $event->newContentStreamId);
$this->createWorkspace($event->workspaceName, $event->baseWorkspaceName, $event->newContentStreamId, $eventEnvelope->version);
}

private function whenWorkspaceWasDiscarded(WorkspaceWasDiscarded $event): void
private function whenWorkspaceWasDiscarded(WorkspaceWasDiscarded $event, EventEnvelope $eventEnvelope): void
{
$this->updateWorkspaceContentStreamId($event->workspaceName, $event->newContentStreamId);
$this->updateWorkspaceContentStreamId($event->workspaceName, $event->newContentStreamId, $eventEnvelope->version);
}

private function whenWorkspaceWasPublished(WorkspaceWasPublished $event): void
private function whenWorkspaceWasPublished(WorkspaceWasPublished $event, EventEnvelope $eventEnvelope): void
{
$this->updateWorkspaceContentStreamId($event->sourceWorkspaceName, $event->newSourceContentStreamId);
$this->updateWorkspaceContentStreamId($event->sourceWorkspaceName, $event->newSourceContentStreamId, $eventEnvelope->version);
}

private function whenWorkspaceWasRebased(WorkspaceWasRebased $event): void
private function whenWorkspaceWasRebased(WorkspaceWasRebased $event, EventEnvelope $eventEnvelope): void
{
$this->updateWorkspaceContentStreamId($event->workspaceName, $event->newContentStreamId);
$this->updateWorkspaceContentStreamId($event->workspaceName, $event->newContentStreamId, $eventEnvelope->version);
}

private function whenWorkspaceWasRemoved(WorkspaceWasRemoved $event): void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ private function createWorkspaceTable(AbstractPlatform $platform): Table
DbalSchemaFactory::columnForWorkspaceName('name', $platform)->setNotnull(true),
DbalSchemaFactory::columnForWorkspaceName('baseWorkspaceName', $platform)->setNotnull(false),
DbalSchemaFactory::columnForContentStreamId('currentContentStreamId', $platform)->setNotNull(true),
(new Column('version', Type::getType(Types::INTEGER)))->setNotnull(true),
]);

$workspaceTable->addUniqueIndex(['currentContentStreamId']);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId;
use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName;
use Neos\EventStore\Model\Event\Version;

/**
* The Workspace projection feature trait
Expand All @@ -14,12 +15,13 @@
*/
trait Workspace
{
private function createWorkspace(WorkspaceName $workspaceName, ?WorkspaceName $baseWorkspaceName, ContentStreamId $contentStreamId): void
private function createWorkspace(WorkspaceName $workspaceName, ?WorkspaceName $baseWorkspaceName, ContentStreamId $contentStreamId, Version $version): void
{
$this->dbal->insert($this->tableNames->workspace(), [
'name' => $workspaceName->value,
'baseWorkspaceName' => $baseWorkspaceName?->value,
'currentContentStreamId' => $contentStreamId->value
'currentContentStreamId' => $contentStreamId->value,
'version' => $version->value,
]);
}

Expand All @@ -31,13 +33,14 @@ private function removeWorkspace(WorkspaceName $workspaceName): void
);
}

private function updateBaseWorkspace(WorkspaceName $workspaceName, WorkspaceName $baseWorkspaceName, ContentStreamId $newContentStreamId): void
private function updateBaseWorkspace(WorkspaceName $workspaceName, WorkspaceName $baseWorkspaceName, ContentStreamId $newContentStreamId, Version $version): void
{
$this->dbal->update(
$this->tableNames->workspace(),
[
'baseWorkspaceName' => $baseWorkspaceName->value,
'currentContentStreamId' => $newContentStreamId->value,
'version' => $version->value,
],
['name' => $workspaceName->value]
);
Expand All @@ -46,9 +49,11 @@ private function updateBaseWorkspace(WorkspaceName $workspaceName, WorkspaceName
private function updateWorkspaceContentStreamId(
WorkspaceName $workspaceName,
ContentStreamId $contentStreamId,
Version $version,
): void {
$this->dbal->update($this->tableNames->workspace(), [
'currentContentStreamId' => $contentStreamId->value,
'version' => $version->value,
], [
'name' => $workspaceName->value
]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ static function ($handle) use ($rebaseableCommands): void {
partial: false
)
),
ExpectedVersion::ANY()
ExpectedVersion::fromVersion($workspace->version),
);

yield $this->removeContentStreamWithoutConstraintChecks($workspace->currentContentStreamId);
Expand Down Expand Up @@ -299,7 +299,7 @@ private function rebaseWorkspaceWithoutChanges(
skippedEvents: []
),
),
ExpectedVersion::ANY()
ExpectedVersion::fromVersion($workspace->version),
);

yield $this->removeContentStreamWithoutConstraintChecks($workspace->currentContentStreamId);
Expand Down Expand Up @@ -419,7 +419,7 @@ static function ($handle) use ($rebaseableCommands): void {
->map(fn (ConflictingEvent $conflictingEvent) => $conflictingEvent->getSequenceNumber())
),
),
ExpectedVersion::ANY()
ExpectedVersion::fromVersion($workspace->version),
),
$this->getCopiedEventsOfEventStream(
$command->workspaceName,
Expand Down Expand Up @@ -538,7 +538,7 @@ static function ($handle) use ($commandSimulator, $matchingCommands, $remainingC
partial: !$remainingCommands->isEmpty()
)
]),
ExpectedVersion::ANY()
ExpectedVersion::fromVersion($workspace->version),
),
$this->getCopiedEventsOfEventStream(
$command->workspaceName,
Expand Down Expand Up @@ -645,7 +645,7 @@ static function ($handle) use ($commandsToKeep): void {
partial: true
)
),
ExpectedVersion::ANY()
ExpectedVersion::fromVersion($workspace->version),
),
$this->getCopiedEventsOfEventStream(
$command->workspaceName,
Expand Down Expand Up @@ -711,7 +711,7 @@ private function discardWorkspace(
partial: false
)
),
ExpectedVersion::ANY()
ExpectedVersion::fromVersion($workspace->version),
);

yield $this->removeContentStreamWithoutConstraintChecks($workspace->currentContentStreamId);
Expand Down Expand Up @@ -760,7 +760,7 @@ private function handleChangeBaseWorkspace(
$command->newContentStreamId,
)
),
ExpectedVersion::ANY()
ExpectedVersion::fromVersion($workspace->version),
);
}

Expand Down Expand Up @@ -791,7 +791,7 @@ private function handleDeleteWorkspace(
$command->workspaceName,
)
),
ExpectedVersion::ANY()
ExpectedVersion::fromVersion($workspace->version),
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

namespace Neos\ContentRepository\Core\SharedModel\Workspace;

use Neos\EventStore\Model\Event\Version;

/**
* Workspace Read Model
*
Expand All @@ -32,7 +34,8 @@ private function __construct(
public ?WorkspaceName $baseWorkspaceName,
public ContentStreamId $currentContentStreamId,
public WorkspaceStatus $status,
private bool $hasPublishableChanges
private bool $hasPublishableChanges,
public Version $version,
) {
if ($this->isRootWorkspace() && $this->hasPublishableChanges) {
throw new \InvalidArgumentException('Root workspaces cannot have changes', 1730371566);
Expand All @@ -47,9 +50,10 @@ public static function create(
?WorkspaceName $baseWorkspaceName,
ContentStreamId $currentContentStreamId,
WorkspaceStatus $status,
bool $hasPublishableChanges
bool $hasPublishableChanges,
Version $version,
): self {
return new self($workspaceName, $baseWorkspaceName, $currentContentStreamId, $status, $hasPublishableChanges);
return new self($workspaceName, $baseWorkspaceName, $currentContentStreamId, $status, $hasPublishableChanges, $version);
}

/**
Expand Down
Loading