From 7a1780e415fbac2db3b108c1431d1368fae3aaa4 Mon Sep 17 00:00:00 2001 From: Baptiste Devessier Date: Tue, 24 Mar 2026 14:56:55 +0100 Subject: [PATCH] Fix duplicate views creation in command (#18900) Ensure the command doesn't fail on workspaces who got standard views seeded the 13/03 --- .../1-20-backfill-page-layouts.command.ts | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-backfill-page-layouts.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-backfill-page-layouts.command.ts index 16c5a0592b..edc692a6a9 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-backfill-page-layouts.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-backfill-page-layouts.command.ts @@ -135,6 +135,16 @@ export class BackfillPageLayoutsCommand extends ActiveOrSuspendedWorkspacesMigra tabUniversalIdentifiers.has(widget.pageLayoutTabUniversalIdentifier), ); + const { + flatViewMaps: existingFlatViewMaps, + flatViewFieldMaps: existingFlatViewFieldMaps, + flatViewFieldGroupMaps: existingFlatViewFieldGroupMaps, + } = await this.workspaceCacheService.getOrRecompute(workspaceId, [ + 'flatViewMaps', + 'flatViewFieldMaps', + 'flatViewFieldGroupMaps', + ]); + const viewUniversalIdentifiers = new Set(); const viewsToCreate = Object.values( @@ -146,6 +156,16 @@ export class BackfillPageLayoutsCommand extends ActiveOrSuspendedWorkspacesMigra return false; } + if ( + isDefined( + existingFlatViewMaps.byUniversalIdentifier[ + view.universalIdentifier + ], + ) + ) { + return false; + } + viewUniversalIdentifiers.add(view.universalIdentifier); return true; @@ -155,16 +175,30 @@ export class BackfillPageLayoutsCommand extends ActiveOrSuspendedWorkspacesMigra standardAllFlatEntityMaps.flatViewFieldMaps.byUniversalIdentifier, ) .filter(isDefined) - .filter((viewField) => - viewUniversalIdentifiers.has(viewField.viewUniversalIdentifier), + .filter( + (viewField) => + viewUniversalIdentifiers.has(viewField.viewUniversalIdentifier) && + !isDefined( + existingFlatViewFieldMaps.byUniversalIdentifier[ + viewField.universalIdentifier + ], + ), ); const viewFieldGroupsToCreate = Object.values( standardAllFlatEntityMaps.flatViewFieldGroupMaps.byUniversalIdentifier, ) .filter(isDefined) - .filter((viewFieldGroup) => - viewUniversalIdentifiers.has(viewFieldGroup.viewUniversalIdentifier), + .filter( + (viewFieldGroup) => + viewUniversalIdentifiers.has( + viewFieldGroup.viewUniversalIdentifier, + ) && + !isDefined( + existingFlatViewFieldGroupMaps.byUniversalIdentifier[ + viewFieldGroup.universalIdentifier + ], + ), ); const validateAndBuildResult =