diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/0-51/0-51-update-workflow-trigger-type-enum.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/0-51/0-51-update-workflow-trigger-type-enum.command.ts new file mode 100644 index 000000000..436078a62 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/0-51/0-51-update-workflow-trigger-type-enum.command.ts @@ -0,0 +1,110 @@ +import { InjectRepository } from '@nestjs/typeorm'; + +import { Command } from 'nest-commander'; +import { Repository } from 'typeorm'; +import { isDefined } from 'twenty-shared/utils'; + +import { + ActiveOrSuspendedWorkspacesMigrationCommandRunner, + RunOnWorkspaceArgs, +} from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; +import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; +import { computeTableName } from 'src/engine/utils/compute-table-name.util'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; + +@Command({ + name: 'upgrade:0-51:upgrade-created-by-enum', + description: 'Upgrade created by enum', +}) +export class UpgradeCreatedByEnumCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { + constructor( + @InjectRepository(Workspace, 'core') + protected readonly workspaceRepository: Repository, + @InjectRepository(ObjectMetadataEntity, 'metadata') + private readonly objectMetadataRepository: Repository, + protected readonly twentyORMGlobalManager: TwentyORMGlobalManager, + private readonly workspaceDataSourceService: WorkspaceDataSourceService, + ) { + super(workspaceRepository, twentyORMGlobalManager); + } + + override async runOnWorkspace({ + index, + total, + workspaceId, + }: RunOnWorkspaceArgs): Promise { + this.logger.log( + `Running command for workspace ${workspaceId} ${index + 1}/${total}`, + ); + + const schemaName = + this.workspaceDataSourceService.getSchemaName(workspaceId); + + const workspaceDataSource = + await this.twentyORMGlobalManager.getDataSourceForWorkspace(workspaceId); + + const objectMetadatas = await this.objectMetadataRepository.find({ + where: { + workspaceId, + }, + relations: ['fields'], + }); + + const queryRunner = workspaceDataSource?.createQueryRunner(); + + await queryRunner.connect(); + await queryRunner.startTransaction(); + + try { + for (const objectMetadata of objectMetadatas) { + if ( + !isDefined( + objectMetadata.fields.find((field) => field.name === 'createdBy'), + ) + ) { + continue; + } + + const tableToUpdate = computeTableName( + objectMetadata.nameSingular, + objectMetadata.isCustom, + ); + + // Set current column as text + await queryRunner.query( + `ALTER TABLE "${schemaName}"."${tableToUpdate}" + ALTER COLUMN "createdBySource" SET DATA TYPE text USING "createdBySource"::text`, + ); + + // Drop default value + await queryRunner.query( + `ALTER TABLE "${schemaName}"."${tableToUpdate}" + ALTER COLUMN "createdBySource" DROP DEFAULT`, + ); + + // Drop the old enum type + await queryRunner.query( + `DROP TYPE "${schemaName}"."${tableToUpdate}_createdBySource_enum"`, + ); + + await queryRunner.query( + `CREATE TYPE "${schemaName}"."${tableToUpdate}_createdBySource_enum" AS ENUM ('EMAIL', 'CALENDAR', 'WORKFLOW', 'API', 'IMPORT', 'MANUAL', 'SYSTEM', 'WEBHOOK')`, + ); + + // Re-apply the enum type + await queryRunner.query( + `ALTER TABLE "${schemaName}"."${tableToUpdate}" + ALTER COLUMN "createdBySource" SET DATA TYPE "${schemaName}"."${tableToUpdate}_createdBySource_enum" USING "createdBySource"::"${schemaName}"."${tableToUpdate}_createdBySource_enum"`, + ); + } + await queryRunner.commitTransaction(); + } catch (error) { + await queryRunner.rollbackTransaction(); + throw error; + } finally { + await queryRunner.release(); + } + } +} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/0-51/0-51-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/0-51/0-51-upgrade-version-command.module.ts index 9992e9345..b46cfdd60 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/0-51/0-51-upgrade-version-command.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/0-51/0-51-upgrade-version-command.module.ts @@ -1,32 +1,22 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { RoleModule } from 'src/engine/metadata-modules/role/role.module'; -import { UserRoleModule } from 'src/engine/metadata-modules/user-role/user-role.module'; -import { WorkspaceMetadataVersionModule } from 'src/engine/metadata-modules/workspace-metadata-version/workspace-metadata-version.module'; -import { WorkspaceMigrationModule } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.module'; import { WorkspaceDataSourceModule } from 'src/engine/workspace-datasource/workspace-datasource.module'; -import { WorkspaceMigrationRunnerModule } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.module'; +import { UpgradeCreatedByEnumCommand } from 'src/database/commands/upgrade-version-command/0-51/0-51-update-workflow-trigger-type-enum.command'; +import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; @Module({ imports: [ - TypeOrmModule.forFeature([Workspace, UserWorkspace], 'core'), + TypeOrmModule.forFeature([Workspace], 'core'), TypeOrmModule.forFeature( - [FieldMetadataEntity, ObjectMetadataEntity], + [ObjectMetadataEntity, FieldMetadataEntity], 'metadata', ), WorkspaceDataSourceModule, - RoleModule, - UserRoleModule, - WorkspaceMigrationModule, - WorkspaceMigrationRunnerModule, - WorkspaceMetadataVersionModule, ], - providers: [], - exports: [], + providers: [UpgradeCreatedByEnumCommand], + exports: [UpgradeCreatedByEnumCommand], }) export class V0_51_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 72409a2c3..64630fbe7 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 @@ -7,6 +7,7 @@ import { V0_50_UpgradeVersionCommandModule } from 'src/database/commands/upgrade import { UpgradeCommand } from 'src/database/commands/upgrade-version-command/upgrade.command'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.module'; +import { V0_51_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/0-51/0-51-upgrade-version-command.module'; @Module({ imports: [ @@ -14,6 +15,7 @@ import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/worksp V0_43_UpgradeVersionCommandModule, V0_44_UpgradeVersionCommandModule, V0_50_UpgradeVersionCommandModule, + V0_51_UpgradeVersionCommandModule, WorkspaceSyncMetadataModule, ], providers: [UpgradeCommand], 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 3c96f331d..f597a0563 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 @@ -20,6 +20,7 @@ import { EnvironmentService } from 'src/engine/core-modules/environment/environm import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command'; +import { UpgradeCreatedByEnumCommand } from 'src/database/commands/upgrade-version-command/0-51/0-51-update-workflow-trigger-type-enum.command'; type VersionCommands = { beforeSyncMetadata: ActiveOrSuspendedWorkspacesMigrationCommandRunner[]; @@ -50,6 +51,9 @@ export class UpgradeCommand extends UpgradeCommandRunner { // 0.44 Commands protected readonly initializePermissionsCommand: InitializePermissionsCommand, protected readonly updateViewAggregateOperationsCommand: UpdateViewAggregateOperationsCommand, + + // 0.51 Commands + protected readonly upgradeCreatedByEnumCommand: UpgradeCreatedByEnumCommand, ) { super( workspaceRepository, @@ -77,12 +81,18 @@ export class UpgradeCommand extends UpgradeCommandRunner { ], afterSyncMetadata: [], }; - const commands_050: VersionCommands = { + + const _commands_050: VersionCommands = { beforeSyncMetadata: [], afterSyncMetadata: [], }; - this.commands = commands_050; + const commands_051: VersionCommands = { + beforeSyncMetadata: [this.upgradeCreatedByEnumCommand], + afterSyncMetadata: [], + }; + + this.commands = commands_051; } override async runBeforeSyncMetadata(args: RunOnWorkspaceArgs) {