From 64dc726f50746b2be4f256898dda8d83d67ab55c Mon Sep 17 00:00:00 2001 From: Weiko Date: Wed, 1 Oct 2025 20:20:20 +0200 Subject: [PATCH] rename application standardId to universalIdentifier (#14825) ## Context Rename standardId in application table to universalIdentifier to align with the rest of migration v2 guidelines --- ...licationStandardIdToUniversalIdentifier.ts | 31 +++++++++++++++++++ .../application/application-sync.service.ts | 26 ++++++++-------- .../application/application.entity.ts | 10 +++--- .../application/application.service.ts | 9 ++++-- 4 files changed, 55 insertions(+), 21 deletions(-) create mode 100644 packages/twenty-server/src/database/typeorm/core/migrations/common/1759341941773-renameApplicationStandardIdToUniversalIdentifier.ts diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/common/1759341941773-renameApplicationStandardIdToUniversalIdentifier.ts b/packages/twenty-server/src/database/typeorm/core/migrations/common/1759341941773-renameApplicationStandardIdToUniversalIdentifier.ts new file mode 100644 index 0000000000..799238d390 --- /dev/null +++ b/packages/twenty-server/src/database/typeorm/core/migrations/common/1759341941773-renameApplicationStandardIdToUniversalIdentifier.ts @@ -0,0 +1,31 @@ +import { type MigrationInterface, type QueryRunner } from 'typeorm'; + +export class RenameApplicationStandardIdToUniversalIdentifier1759341941773 + implements MigrationInterface +{ + name = 'RenameApplicationStandardIdToUniversalIdentifier1759341941773'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP INDEX "core"."IDX_APPLICATION_STANDARD_ID_WORKSPACE_ID_UNIQUE"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."application" RENAME COLUMN "standardId" TO "universalIdentifier"`, + ); + await queryRunner.query( + `CREATE UNIQUE INDEX "IDX_APPLICATION_UNIVERSAL_IDENTIFIER_WORKSPACE_ID_UNIQUE" ON "core"."application" ("universalIdentifier", "workspaceId") WHERE "deletedAt" IS NULL AND "universalIdentifier" IS NOT NULL`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP INDEX "core"."IDX_APPLICATION_UNIVERSAL_IDENTIFIER_WORKSPACE_ID_UNIQUE"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."application" RENAME COLUMN "universalIdentifier" TO "standardId"`, + ); + await queryRunner.query( + `CREATE UNIQUE INDEX "IDX_APPLICATION_STANDARD_ID_WORKSPACE_ID_UNIQUE" ON "core"."application" ("standardId", "workspaceId") WHERE (("deletedAt" IS NULL) AND ("standardId" IS NOT NULL))`, + ); + } +} diff --git a/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts index 53ce46b164..9d6f9fedfb 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-sync.service.ts @@ -2,22 +2,22 @@ import { Injectable, Logger } from '@nestjs/common'; import { isDefined } from 'twenty-shared/utils'; -import { - AgentManifest, - ObjectManifest, -} from 'src/engine/core-modules/application/types/application.types'; -import { ApplicationService } from 'src/engine/core-modules/application/application.service'; -import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.service.'; -import type { FlatObjectMetadataWithFlatFieldMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-with-flat-field-metadata-maps.type'; -import { ObjectMetadataServiceV2 } from 'src/engine/metadata-modules/object-metadata/object-metadata-v2.service'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { AgentService } from 'src/engine/metadata-modules/agent/agent.service'; import { ApplicationException, ApplicationExceptionCode, } from 'src/engine/core-modules/application/application.exception'; -import { ServerlessFunctionLayerService } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.service'; +import { ApplicationService } from 'src/engine/core-modules/application/application.service'; import { ApplicationInput } from 'src/engine/core-modules/application/dtos/application.input'; +import { + AgentManifest, + ObjectManifest, +} from 'src/engine/core-modules/application/types/application.types'; +import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.service.'; +import { AgentService } from 'src/engine/metadata-modules/agent/agent.service'; +import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; +import type { FlatObjectMetadataWithFlatFieldMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-with-flat-field-metadata-maps.type'; +import { ObjectMetadataServiceV2 } from 'src/engine/metadata-modules/object-metadata/object-metadata-v2.service'; +import { ServerlessFunctionLayerService } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.service'; @Injectable() export class ApplicationSyncService { @@ -70,7 +70,7 @@ export class ApplicationSyncService { }: ApplicationInput & { workspaceId: string; }): Promise { - const application = await this.applicationService.findByStandardId( + const application = await this.applicationService.findByUniversalIdentifier( manifest.standardId, workspaceId, ); @@ -85,7 +85,7 @@ export class ApplicationSyncService { workspaceId, ); const createdApplication = await this.applicationService.create({ - standardId: manifest.standardId, + universalIdentifier: manifest.standardId, label: manifest.label, description: manifest.description, version: manifest.version, diff --git a/packages/twenty-server/src/engine/core-modules/application/application.entity.ts b/packages/twenty-server/src/engine/core-modules/application/application.entity.ts index 24039c3e09..c678b85a2b 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application.entity.ts @@ -15,18 +15,18 @@ import { import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { AgentEntity } from 'src/engine/metadata-modules/agent/agent.entity'; -import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { ServerlessFunctionLayerEntity } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity'; +import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; @Entity({ name: 'application', schema: 'core' }) @Index('IDX_APPLICATION_WORKSPACE_ID', ['workspaceId']) @Index( - 'IDX_APPLICATION_STANDARD_ID_WORKSPACE_ID_UNIQUE', - ['standardId', 'workspaceId'], + 'IDX_APPLICATION_UNIVERSAL_IDENTIFIER_WORKSPACE_ID_UNIQUE', + ['universalIdentifier', 'workspaceId'], { unique: true, - where: '"deletedAt" IS NULL AND "standardId" IS NOT NULL', + where: '"deletedAt" IS NULL AND "universalIdentifier" IS NOT NULL', }, ) export class ApplicationEntity { @@ -34,7 +34,7 @@ export class ApplicationEntity { id: string; @Column({ nullable: true, type: 'uuid' }) - standardId?: string; + universalIdentifier?: string; @Column({ nullable: false, type: 'text' }) label: string; diff --git a/packages/twenty-server/src/engine/core-modules/application/application.service.ts b/packages/twenty-server/src/engine/core-modules/application/application.service.ts index 633a1c2660..82b5a457fe 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application.service.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application.service.ts @@ -19,17 +19,20 @@ export class ApplicationService { }); } - async findByStandardId(standardId: string, workspaceId: string) { + async findByUniversalIdentifier( + universalIdentifier: string, + workspaceId: string, + ) { return this.applicationRepository.findOne({ where: { - standardId, + universalIdentifier, workspaceId, }, }); } async create(data: { - standardId?: string; + universalIdentifier?: string; label: string; description?: string; version?: string;