diff --git a/packages/cli/src/databases/entities/ExecutionEntity.ts b/packages/cli/src/databases/entities/ExecutionEntity.ts index 8301346a71..f71bf0ba57 100644 --- a/packages/cli/src/databases/entities/ExecutionEntity.ts +++ b/packages/cli/src/databases/entities/ExecutionEntity.ts @@ -49,6 +49,9 @@ export class ExecutionEntity { @Column({ type: datetimeColumnType, nullable: true }) stoppedAt: Date; + @Column(datetimeColumnType) + deletedAt: Date; + @Column({ nullable: true }) workflowId: string; diff --git a/packages/cli/src/databases/migrations/common/1693491613982-ExecutionSoftDelete.ts b/packages/cli/src/databases/migrations/common/1693491613982-ExecutionSoftDelete.ts new file mode 100644 index 0000000000..50e31e809b --- /dev/null +++ b/packages/cli/src/databases/migrations/common/1693491613982-ExecutionSoftDelete.ts @@ -0,0 +1,19 @@ +import type { MigrationContext, ReversibleMigration } from '@/databases/types'; + +/** + * Add an indexed column `deletedAt` to track soft-deleted executions. + * Add an index on `stoppedAt`, used by executions pruning. + */ +export class ExecutionSoftDelete1693491613982 implements ReversibleMigration { + async up({ schemaBuilder: { addColumns, column, createIndex } }: MigrationContext) { + await addColumns('execution_entity', [column('deletedAt').timestamp()]); + await createIndex('execution_entity', ['deletedAt']); + await createIndex('execution_entity', ['stoppedAt']); + } + + async down({ schemaBuilder: { dropColumns, dropIndex } }: MigrationContext) { + await dropIndex('execution_entity', ['stoppedAt']); + await dropIndex('execution_entity', ['deletedAt']); + await dropColumns('execution_entity', ['deletedAt']); + } +} diff --git a/packages/cli/src/databases/migrations/mysqldb/index.ts b/packages/cli/src/databases/migrations/mysqldb/index.ts index ce89cb312c..b7aa3bd0e1 100644 --- a/packages/cli/src/databases/migrations/mysqldb/index.ts +++ b/packages/cli/src/databases/migrations/mysqldb/index.ts @@ -46,6 +46,7 @@ import { RemoveResetPasswordColumns1690000000030 } from '../common/1690000000030 import { CreateWorkflowNameIndex1691088862123 } from '../common/1691088862123-CreateWorkflowNameIndex'; import { AddMfaColumns1690000000030 } from './../common/1690000000040-AddMfaColumns'; import { CreateWorkflowHistoryTable1692967111175 } from '../common/1692967111175-CreateWorkflowHistoryTable'; +import { ExecutionSoftDelete1693491613982 } from '../common/1693491613982-ExecutionSoftDelete'; export const mysqlMigrations: Migration[] = [ InitialMigration1588157391238, @@ -95,4 +96,5 @@ export const mysqlMigrations: Migration[] = [ CreateWorkflowNameIndex1691088862123, AddMfaColumns1690000000030, CreateWorkflowHistoryTable1692967111175, + ExecutionSoftDelete1693491613982, ]; diff --git a/packages/cli/src/databases/migrations/postgresdb/index.ts b/packages/cli/src/databases/migrations/postgresdb/index.ts index 89249058e6..673cd03fe8 100644 --- a/packages/cli/src/databases/migrations/postgresdb/index.ts +++ b/packages/cli/src/databases/migrations/postgresdb/index.ts @@ -44,6 +44,7 @@ import { AddMissingPrimaryKeyOnExecutionData1690787606731 } from './169078760673 import { CreateWorkflowNameIndex1691088862123 } from '../common/1691088862123-CreateWorkflowNameIndex'; import { AddMfaColumns1690000000030 } from './../common/1690000000040-AddMfaColumns'; import { CreateWorkflowHistoryTable1692967111175 } from '../common/1692967111175-CreateWorkflowHistoryTable'; +import { ExecutionSoftDelete1693491613982 } from '../common/1693491613982-ExecutionSoftDelete'; export const postgresMigrations: Migration[] = [ InitialMigration1587669153312, @@ -91,4 +92,5 @@ export const postgresMigrations: Migration[] = [ CreateWorkflowNameIndex1691088862123, AddMfaColumns1690000000030, CreateWorkflowHistoryTable1692967111175, + ExecutionSoftDelete1693491613982, ]; diff --git a/packages/cli/src/databases/migrations/sqlite/1693491613982-ExecutionSoftDelete.ts b/packages/cli/src/databases/migrations/sqlite/1693491613982-ExecutionSoftDelete.ts new file mode 100644 index 0000000000..2a5dd30cf8 --- /dev/null +++ b/packages/cli/src/databases/migrations/sqlite/1693491613982-ExecutionSoftDelete.ts @@ -0,0 +1,5 @@ +import { ExecutionSoftDelete1693491613982 as BaseMigration } from '../common/1693491613982-ExecutionSoftDelete'; + +export class ExecutionSoftDelete1693491613982 extends BaseMigration { + transaction = false as const; +} diff --git a/packages/cli/src/databases/migrations/sqlite/index.ts b/packages/cli/src/databases/migrations/sqlite/index.ts index 9bac59767b..325ffbe6bd 100644 --- a/packages/cli/src/databases/migrations/sqlite/index.ts +++ b/packages/cli/src/databases/migrations/sqlite/index.ts @@ -43,6 +43,7 @@ import { RemoveResetPasswordColumns1690000000030 } from './1690000000030-RemoveR import { CreateWorkflowNameIndex1691088862123 } from '../common/1691088862123-CreateWorkflowNameIndex'; import { AddMfaColumns1690000000030 } from './1690000000040-AddMfaColumns'; import { CreateWorkflowHistoryTable1692967111175 } from '../common/1692967111175-CreateWorkflowHistoryTable'; +import { ExecutionSoftDelete1693491613982 } from './1693491613982-ExecutionSoftDelete'; const sqliteMigrations: Migration[] = [ InitialMigration1588102412422, @@ -89,6 +90,7 @@ const sqliteMigrations: Migration[] = [ CreateWorkflowNameIndex1691088862123, AddMfaColumns1690000000030, CreateWorkflowHistoryTable1692967111175, + ExecutionSoftDelete1693491613982, ]; export { sqliteMigrations };