From 1ce4da5b6761afe16826c790e6b65adee89b529c Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Tue, 31 Mar 2026 12:47:01 +0200 Subject: [PATCH] Fix upgrade commands 2 (#19157) --- .../1-20-upgrade-version-command.module.ts | 3 --- ...-and-fields-widget-view-fields.command.ts} | 10 ++++---- .../1-21-upgrade-version-command.module.ts | 24 +++++++++++++++++++ .../upgrade-version-command.module.ts | 2 ++ .../upgrade.command.ts | 12 +++++++--- ...tifier-and-application-id-not-null.util.ts | 3 +++ ...tifier-and-application-id-not-null.util.ts | 3 +++ ...tifier-and-application-id-not-null.util.ts | 3 +++ ...-makeNavigationMenuItemTypeNotNull.util.ts | 3 +++ ...ade-command-supported-versions.constant.ts | 6 ++++- 10 files changed, 57 insertions(+), 12 deletions(-) rename packages/twenty-server/src/database/commands/upgrade-version-command/{1-20/1-20-backfill-page-layouts-and-fields-widget-view-fields.command.ts => 1-21/1-21-backfill-page-layouts-and-fields-widget-view-fields.command.ts} (99%) create mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-upgrade-version-command.module.ts diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-upgrade-version-command.module.ts index f85cb820b4..1327f3dfd0 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-upgrade-version-command.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-upgrade-version-command.module.ts @@ -3,7 +3,6 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { BackfillCommandMenuItemsCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-backfill-command-menu-items.command'; import { BackfillNavigationMenuItemTypeCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-backfill-navigation-menu-item-type.command'; -import { BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-backfill-page-layouts-and-fields-widget-view-fields.command'; import { BackfillSelectFieldOptionIdsCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-backfill-select-field-option-ids.command'; import { DeleteOrphanNavigationMenuItemsCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-delete-orphan-navigation-menu-items.command'; import { IdentifyFieldPermissionMetadataCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-identify-field-permission-metadata.command'; @@ -66,7 +65,6 @@ import { WorkflowCommonModule } from 'src/modules/workflow/common/workflow-commo MakeFieldPermissionUniversalIdentifierAndApplicationIdNotNullableMigrationCommand, BackfillCommandMenuItemsCommand, BackfillNavigationMenuItemTypeCommand, - BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand, BackfillSelectFieldOptionIdsCommand, DeleteOrphanNavigationMenuItemsCommand, SeedCliApplicationRegistrationCommand, @@ -84,7 +82,6 @@ import { WorkflowCommonModule } from 'src/modules/workflow/common/workflow-commo MakeFieldPermissionUniversalIdentifierAndApplicationIdNotNullableMigrationCommand, BackfillCommandMenuItemsCommand, BackfillNavigationMenuItemTypeCommand, - BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand, BackfillSelectFieldOptionIdsCommand, DeleteOrphanNavigationMenuItemsCommand, SeedCliApplicationRegistrationCommand, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-backfill-page-layouts-and-fields-widget-view-fields.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-backfill-page-layouts-and-fields-widget-view-fields.command.ts similarity index 99% rename from packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-backfill-page-layouts-and-fields-widget-view-fields.command.ts rename to packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-backfill-page-layouts-and-fields-widget-view-fields.command.ts index 4e81cf7895..56988d8758 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-20/1-20-backfill-page-layouts-and-fields-widget-view-fields.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-backfill-page-layouts-and-fields-widget-view-fields.command.ts @@ -87,7 +87,7 @@ const isRelationTargetAvailable = ( }; @Command({ - name: 'upgrade:1-20:backfill-page-layouts-and-fields-widget-view-fields', + name: 'upgrade:1-21:backfill-page-layouts-and-fields-widget-view-fields', description: 'Backfill RECORD_PAGE page layouts, sync FIELDS_WIDGET view fields, create FIELD widgets, and enable IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED', }) @@ -594,7 +594,7 @@ export class BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand extends ActiveO } } - // Build object ID → objectMetadata map + // Build object ID -> objectMetadata map const objectById = new Map(); for (const obj of Object.values( @@ -605,7 +605,7 @@ export class BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand extends ActiveO } } - // Build object ID → RECORD_PAGE layout map + // Build object ID -> RECORD_PAGE layout map const recordPageLayoutByObjectId = new Map< string, { id: string; universalIdentifier: string } @@ -626,7 +626,7 @@ export class BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand extends ActiveO } } - // Build pageLayoutId → home tab map + // Build pageLayoutId -> home tab map const homeTabByPageLayoutId = new Map< string, { @@ -655,7 +655,7 @@ export class BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand extends ActiveO // Group fields by objectMetadataId const fieldsByObjectId = new Map(); - // Map morphId → all field IDs sharing that morphId (for dedup) + // Map morphId -> all field IDs sharing that morphId (for dedup) const fieldIdsByMorphId = new Map(); for (const field of Object.values( diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-upgrade-version-command.module.ts new file mode 100644 index 0000000000..2de2445be8 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-upgrade-version-command.module.ts @@ -0,0 +1,24 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +import { BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand } from 'src/database/commands/upgrade-version-command/1-21/1-21-backfill-page-layouts-and-fields-widget-view-fields.command'; +import { ApplicationModule } from 'src/engine/core-modules/application/application.module'; +import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; +import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; +import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module'; +import { WorkspaceMigrationModule } from 'src/engine/workspace-manager/workspace-migration/workspace-migration.module'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([WorkspaceEntity]), + DataSourceModule, + WorkspaceCacheModule, + ApplicationModule, + WorkspaceMigrationModule, + FeatureFlagModule, + ], + providers: [BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand], + exports: [BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand], +}) +export class V1_21_UpgradeVersionCommandModule {} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts index ba38815670..2edbc37f3e 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts @@ -2,6 +2,7 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { V1_20_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-20/1-20-upgrade-version-command.module'; +import { V1_21_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-21/1-21-upgrade-version-command.module'; import { UpgradeCommand } from 'src/database/commands/upgrade-version-command/upgrade.command'; import { CoreEngineVersionModule } from 'src/engine/core-engine-version/core-engine-version.module'; import { CoreMigrationRunnerModule } from 'src/database/commands/core-migration-runner/core-migration-runner.module'; @@ -13,6 +14,7 @@ import { WorkspaceVersionModule } from 'src/engine/workspace-manager/workspace-v imports: [ TypeOrmModule.forFeature([WorkspaceEntity]), V1_20_UpgradeVersionCommandModule, + V1_21_UpgradeVersionCommandModule, DataSourceModule, CoreEngineVersionModule, CoreMigrationRunnerModule, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts index 528d9ce06c..8d0f3821f6 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts @@ -12,7 +12,7 @@ import { import { CoreMigrationRunnerService } from 'src/database/commands/core-migration-runner/services/core-migration-runner.service'; import { BackfillCommandMenuItemsCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-backfill-command-menu-items.command'; import { BackfillNavigationMenuItemTypeCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-backfill-navigation-menu-item-type.command'; -import { BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-backfill-page-layouts-and-fields-widget-view-fields.command'; +import { BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand } from 'src/database/commands/upgrade-version-command/1-21/1-21-backfill-page-layouts-and-fields-widget-view-fields.command'; import { IdentifyFieldPermissionMetadataCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-identify-field-permission-metadata.command'; import { BackfillSelectFieldOptionIdsCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-backfill-select-field-option-ids.command'; import { DeleteOrphanNavigationMenuItemsCommand } from 'src/database/commands/upgrade-version-command/1-20/1-20-delete-orphan-navigation-menu-items.command'; @@ -60,13 +60,15 @@ export class UpgradeCommand extends UpgradeCommandRunner { protected readonly backfillNavigationMenuItemTypeCommand: BackfillNavigationMenuItemTypeCommand, protected readonly backfillCommandMenuItemsCommand: BackfillCommandMenuItemsCommand, protected readonly deleteOrphanNavigationMenuItemsCommand: DeleteOrphanNavigationMenuItemsCommand, - protected readonly backfillPageLayoutsAndFieldsWidgetViewFieldsCommand: BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand, protected readonly seedCliApplicationRegistrationCommand: SeedCliApplicationRegistrationCommand, protected readonly migrateRichTextToTextCommand: MigrateRichTextToTextCommand, protected readonly migrateMessagingInfrastructureToMetadataCommand: MigrateMessagingInfrastructureToMetadataCommand, protected readonly backfillSelectFieldOptionIdsCommand: BackfillSelectFieldOptionIdsCommand, protected readonly updateStandardIndexViewNamesCommand: UpdateStandardIndexViewNamesCommand, protected readonly makeWorkflowSearchableCommand: MakeWorkflowSearchableCommand, + + // 1.21 Commands + protected readonly backfillPageLayoutsAndFieldsWidgetViewFieldsCommand: BackfillPageLayoutsAndFieldsWidgetViewFieldsCommand, ) { super( workspaceRepository, @@ -92,7 +94,6 @@ export class UpgradeCommand extends UpgradeCommandRunner { this.migrateRichTextToTextCommand, this.deleteOrphanNavigationMenuItemsCommand, this.backfillCommandMenuItemsCommand, - this.backfillPageLayoutsAndFieldsWidgetViewFieldsCommand, this.seedCliApplicationRegistrationCommand, this.migrateMessagingInfrastructureToMetadataCommand, this.backfillSelectFieldOptionIdsCommand, @@ -100,9 +101,14 @@ export class UpgradeCommand extends UpgradeCommandRunner { this.makeWorkflowSearchableCommand, ]; + const commands_1210: VersionCommands = [ + this.backfillPageLayoutsAndFieldsWidgetViewFieldsCommand, + ]; + this.allCommands = { '1.19.0': [], '1.20.0': commands_1200, + '1.21.0': commands_1210, }; } diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773232418467-make-permission-flag-universal-identifier-and-application-id-not-null.util.ts b/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773232418467-make-permission-flag-universal-identifier-and-application-id-not-null.util.ts index 9a72a187b0..f793b07b91 100644 --- a/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773232418467-make-permission-flag-universal-identifier-and-application-id-not-null.util.ts +++ b/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773232418467-make-permission-flag-universal-identifier-and-application-id-not-null.util.ts @@ -14,6 +14,9 @@ export const makePermissionFlagUniversalIdentifierAndApplicationIdNotNullQueries await queryRunner.query( `CREATE UNIQUE INDEX "IDX_da8ffd3c24b4a819430a861067" ON "core"."permissionFlag" ("workspaceId", "universalIdentifier")`, ); + await queryRunner.query( + `ALTER TABLE "core"."permissionFlag" DROP CONSTRAINT IF EXISTS "FK_b26a9d39a88d0e72373c677c6c5"`, + ); await queryRunner.query( `ALTER TABLE "core"."permissionFlag" ADD CONSTRAINT "FK_b26a9d39a88d0e72373c677c6c5" FOREIGN KEY ("applicationId") REFERENCES "core"."application"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, ); diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773317160558-make-object-permission-universal-identifier-and-application-id-not-null.util.ts b/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773317160558-make-object-permission-universal-identifier-and-application-id-not-null.util.ts index 721600a3ac..bdb6926305 100644 --- a/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773317160558-make-object-permission-universal-identifier-and-application-id-not-null.util.ts +++ b/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773317160558-make-object-permission-universal-identifier-and-application-id-not-null.util.ts @@ -14,6 +14,9 @@ export const makeObjectPermissionUniversalIdentifierAndApplicationIdNotNullQueri await queryRunner.query( `CREATE UNIQUE INDEX "IDX_c5ea53618b32558fe24e495f21" ON "core"."objectPermission" ("workspaceId", "universalIdentifier")`, ); + await queryRunner.query( + `ALTER TABLE "core"."objectPermission" DROP CONSTRAINT IF EXISTS "FK_f2ecee1066fd43800dbc85f87e4"`, + ); await queryRunner.query( `ALTER TABLE "core"."objectPermission" ADD CONSTRAINT "FK_f2ecee1066fd43800dbc85f87e4" FOREIGN KEY ("applicationId") REFERENCES "core"."application"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, ); diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773400000000-make-field-permission-universal-identifier-and-application-id-not-null.util.ts b/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773400000000-make-field-permission-universal-identifier-and-application-id-not-null.util.ts index 8065f048ff..3c7855b915 100644 --- a/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773400000000-make-field-permission-universal-identifier-and-application-id-not-null.util.ts +++ b/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773400000000-make-field-permission-universal-identifier-and-application-id-not-null.util.ts @@ -14,6 +14,9 @@ export const makeFieldPermissionUniversalIdentifierAndApplicationIdNotNullQuerie await queryRunner.query( `CREATE UNIQUE INDEX "IDX_0dedb90c717e179ef653c512b9" ON "core"."fieldPermission" ("workspaceId", "universalIdentifier")`, ); + await queryRunner.query( + `ALTER TABLE "core"."fieldPermission" DROP CONSTRAINT IF EXISTS "FK_71cc60c4a1c9f8a7c434d91d38c"`, + ); await queryRunner.query( `ALTER TABLE "core"."fieldPermission" ADD CONSTRAINT "FK_71cc60c4a1c9f8a7c434d91d38c" FOREIGN KEY ("applicationId") REFERENCES "core"."application"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, ); diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773681736596-makeNavigationMenuItemTypeNotNull.util.ts b/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773681736596-makeNavigationMenuItemTypeNotNull.util.ts index 862581b008..d1e2083586 100644 --- a/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773681736596-makeNavigationMenuItemTypeNotNull.util.ts +++ b/packages/twenty-server/src/database/typeorm/core/migrations/utils/1773681736596-makeNavigationMenuItemTypeNotNull.util.ts @@ -7,6 +7,9 @@ export const makeNavigationMenuItemTypeNotNullQueries = async ( `ALTER TABLE "core"."navigationMenuItem" ALTER COLUMN "type" SET NOT NULL`, ); + await queryRunner.query( + `ALTER TABLE "core"."navigationMenuItem" DROP CONSTRAINT IF EXISTS "CHK_navigation_menu_item_type_fields"`, + ); await queryRunner.query( `ALTER TABLE "core"."navigationMenuItem" ADD CONSTRAINT "CHK_navigation_menu_item_type_fields" CHECK ( ("type" = 'FOLDER') diff --git a/packages/twenty-server/src/engine/constants/upgrade-command-supported-versions.constant.ts b/packages/twenty-server/src/engine/constants/upgrade-command-supported-versions.constant.ts index b0072e504a..b6d6781658 100644 --- a/packages/twenty-server/src/engine/constants/upgrade-command-supported-versions.constant.ts +++ b/packages/twenty-server/src/engine/constants/upgrade-command-supported-versions.constant.ts @@ -1,4 +1,8 @@ -export const UPGRADE_COMMAND_SUPPORTED_VERSIONS = ['1.19.0', '1.20.0'] as const; +export const UPGRADE_COMMAND_SUPPORTED_VERSIONS = [ + '1.19.0', + '1.20.0', + '1.21.0', +] as const; export type UpgradeCommandVersion = (typeof UPGRADE_COMMAND_SUPPORTED_VERSIONS)[number];