import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; import { Command } from 'nest-commander'; import { DataSource, Repository } from 'typeorm'; import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; import { updateFileTableQueries } from 'src/database/typeorm/core/migrations/utils/1768572831179-updateFileTable.util'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; @Command({ name: 'upgrade:1-17:update-file-table-migration', description: 'Update file table schema with applicationId and new columns', }) export class UpdateFileTableMigrationCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { private hasRunOnce = false; constructor( @InjectRepository(WorkspaceEntity) protected readonly workspaceRepository: Repository, protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, protected readonly dataSourceService: DataSourceService, @InjectDataSource() private readonly coreDataSource: DataSource, ) { super(workspaceRepository, twentyORMGlobalManager, dataSourceService); } override async runOnWorkspace({ options, }: RunOnWorkspaceArgs): Promise { if (this.hasRunOnce) { this.logger.warn( 'Skipping has already been run once UpdateFileTableMigrationCommand', ); return; } if (options.dryRun) { return; } const queryRunner = this.coreDataSource.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { await updateFileTableQueries(queryRunner); await queryRunner.commitTransaction(); this.logger.log('Successfully run UpdateFileTableMigrationCommand'); this.hasRunOnce = true; } catch (error) { await queryRunner.rollbackTransaction(); this.logger.error( `Rolling back UpdateFileTableMigrationCommand: ${error.message}`, ); } finally { await queryRunner.release(); } } }