diff --git a/packages/cli/.eslintrc.js b/packages/cli/.eslintrc.js index 2a24787f80e76..20c82ed9952b1 100644 --- a/packages/cli/.eslintrc.js +++ b/packages/cli/.eslintrc.js @@ -11,7 +11,6 @@ module.exports = { ignorePatterns: [ 'jest.config.js', // TODO: Remove these - 'src/databases/migrations/**', 'src/databases/ormconfig.ts', ], diff --git a/packages/cli/src/Db.ts b/packages/cli/src/Db.ts index 85cee05551553..114aa22a3116f 100644 --- a/packages/cli/src/Db.ts +++ b/packages/cli/src/Db.ts @@ -7,7 +7,7 @@ import { Container } from 'typedi'; import type { DataSourceOptions as ConnectionOptions, EntityManager, LoggerOptions } from 'typeorm'; import { DataSource as Connection } from 'typeorm'; import type { TlsOptions } from 'tls'; -import type { DatabaseType, IDatabaseCollections } from '@/Interfaces'; +import type { IDatabaseCollections } from '@/Interfaces'; import config from '@/config'; @@ -19,6 +19,8 @@ import { getPostgresConnectionOptions, getSqliteConnectionOptions, } from '@db/config'; +import { wrapMigration } from '@db/utils/migrationHelpers'; +import type { DatabaseType, Migration } from '@db/types'; import { AuthIdentityRepository, AuthProviderSyncHistoryRepository, @@ -119,7 +121,7 @@ export async function init( synchronize: false, logging: loggingOption, maxQueryExecutionTime, - migrationsTransactionMode: 'each', + migrationsRun: false, }); connection = new Connection(connectionOptions); @@ -136,15 +138,17 @@ export async function init( await connection.query(`SET search_path TO ${searchPath.join(',')};`); } + (connectionOptions.migrations as Migration[]).forEach(wrapMigration); + if (!testConnectionOptions && dbType === 'sqlite') { // This specific migration changes database metadata. // A field is now nullable. We need to reconnect so that // n8n knows it has changed. Happens only on sqlite. let migrations = []; try { - const entityPrefix = config.getEnv('database.tablePrefix'); + const tablePrefix = config.getEnv('database.tablePrefix'); migrations = await connection.query( - `SELECT id FROM ${entityPrefix}migrations where name = "MakeStoppedAtNullable1607431743769"`, + `SELECT id FROM ${tablePrefix}migrations where name = "MakeStoppedAtNullable1607431743769"`, ); } catch (error) { // Migration table does not exist yet - it will be created after migrations run for the first time. diff --git a/packages/cli/src/Interfaces.ts b/packages/cli/src/Interfaces.ts index 374cd9b9e9a1b..c35a249fa8e37 100644 --- a/packages/cli/src/Interfaces.ts +++ b/packages/cli/src/Interfaces.ts @@ -32,6 +32,7 @@ import type { FindOperator } from 'typeorm'; import type { ChildProcess } from 'child_process'; +import type { DatabaseType } from '@db/types'; import type { AuthProviderType } from '@db/entities/AuthIdentity'; import type { Role } from '@db/entities/Role'; import type { SharedCredentials } from '@db/entities/SharedCredentials'; @@ -160,7 +161,6 @@ export type ICredentialsDecryptedDb = ICredentialsBase & ICredentialsDecrypted; export type ICredentialsDecryptedResponse = ICredentialsDecryptedDb; -export type DatabaseType = 'mariadb' | 'postgresdb' | 'mysqldb' | 'sqlite'; export type SaveExecutionDataType = 'all' | 'none'; export interface IExecutionBase { diff --git a/packages/cli/src/databases/config.ts b/packages/cli/src/databases/config.ts index 739c2138e3bed..b496ea5bcf6f0 100644 --- a/packages/cli/src/databases/config.ts +++ b/packages/cli/src/databases/config.ts @@ -8,7 +8,7 @@ import { entities } from './entities'; import { mysqlMigrations } from './migrations/mysqldb'; import { postgresMigrations } from './migrations/postgresdb'; import { sqliteMigrations } from './migrations/sqlite'; -import type { DatabaseType } from '@/Interfaces'; +import type { DatabaseType } from '@db/types'; import config from '@/config'; const entitiesDir = path.resolve(__dirname, 'entities'); @@ -35,7 +35,6 @@ const getDBConnectionOptions = (dbType: DatabaseType) => { return { entityPrefix, entities: Object.values(entities), - migrationsRun: false, migrationsTableName: `${entityPrefix}migrations`, cli: { entitiesDir, migrationsDir }, ...connectionDetails, diff --git a/packages/cli/src/databases/migrations/mysqldb/1588157391238-InitialMigration.ts b/packages/cli/src/databases/migrations/mysqldb/1588157391238-InitialMigration.ts index 700bbc26491f1..0cf659d285f25 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1588157391238-InitialMigration.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1588157391238-InitialMigration.ts @@ -1,20 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; - -import config from '@/config'; - -export class InitialMigration1588157391238 implements MigrationInterface { - name = 'InitialMigration1588157391238'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class InitialMigration1588157391238 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'CREATE TABLE IF NOT EXISTS `' + tablePrefix + 'credentials_entity` (`id` int NOT NULL AUTO_INCREMENT, `name` varchar(128) NOT NULL, `data` text NOT NULL, `type` varchar(32) NOT NULL, `nodesAccess` json NOT NULL, `createdAt` datetime NOT NULL, `updatedAt` datetime NOT NULL, INDEX `IDX_' + tablePrefix + '07fde106c0b471d8cc80a64fc8` (`type`), PRIMARY KEY (`id`)) ENGINE=InnoDB', - undefined, ); await queryRunner.query( 'CREATE TABLE IF NOT EXISTS `' + @@ -22,37 +15,31 @@ export class InitialMigration1588157391238 implements MigrationInterface { 'execution_entity` (`id` int NOT NULL AUTO_INCREMENT, `data` text NOT NULL, `finished` tinyint NOT NULL, `mode` varchar(255) NOT NULL, `retryOf` varchar(255) NULL, `retrySuccessId` varchar(255) NULL, `startedAt` datetime NOT NULL, `stoppedAt` datetime NOT NULL, `workflowData` json NOT NULL, `workflowId` varchar(255) NULL, INDEX `IDX_' + tablePrefix + 'c4d999a5e90784e8caccf5589d` (`workflowId`), PRIMARY KEY (`id`)) ENGINE=InnoDB', - undefined, ); await queryRunner.query( 'CREATE TABLE IF NOT EXISTS`' + tablePrefix + 'workflow_entity` (`id` int NOT NULL AUTO_INCREMENT, `name` varchar(128) NOT NULL, `active` tinyint NOT NULL, `nodes` json NOT NULL, `connections` json NOT NULL, `createdAt` datetime NOT NULL, `updatedAt` datetime NOT NULL, `settings` json NULL, `staticData` json NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB', - undefined, ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - - await queryRunner.query('DROP TABLE `' + tablePrefix + 'workflow_entity`', undefined); + async down({ queryRunner, tablePrefix }: MigrationContext) { + await queryRunner.query('DROP TABLE `' + tablePrefix + 'workflow_entity`'); await queryRunner.query( 'DROP INDEX `IDX_' + tablePrefix + 'c4d999a5e90784e8caccf5589d` ON `' + tablePrefix + 'execution_entity`', - undefined, ); - await queryRunner.query('DROP TABLE `' + tablePrefix + 'execution_entity`', undefined); + await queryRunner.query('DROP TABLE `' + tablePrefix + 'execution_entity`'); await queryRunner.query( 'DROP INDEX `IDX_' + tablePrefix + '07fde106c0b471d8cc80a64fc8` ON `' + tablePrefix + 'credentials_entity`', - undefined, ); - await queryRunner.query('DROP TABLE `' + tablePrefix + 'credentials_entity`', undefined); + await queryRunner.query('DROP TABLE `' + tablePrefix + 'credentials_entity`'); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1592447867632-WebhookModel.ts b/packages/cli/src/databases/migrations/mysqldb/1592447867632-WebhookModel.ts index 55c8da1b38241..0ffa4b10c28b1 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1592447867632-WebhookModel.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1592447867632-WebhookModel.ts @@ -1,20 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; - -import config from '@/config'; - -export class WebhookModel1592447867632 implements MigrationInterface { - name = 'WebhookModel1592447867632'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class WebhookModel1592447867632 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE IF NOT EXISTS ${tablePrefix}webhook_entity (workflowId int NOT NULL, webhookPath varchar(255) NOT NULL, method varchar(255) NOT NULL, node varchar(255) NOT NULL, PRIMARY KEY (webhookPath, method)) ENGINE=InnoDB`, ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE ${tablePrefix}webhook_entity`); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1594902918301-CreateIndexStoppedAt.ts b/packages/cli/src/databases/migrations/mysqldb/1594902918301-CreateIndexStoppedAt.ts index 8cc6f254c7e40..5ec7bc08fcc33 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1594902918301-CreateIndexStoppedAt.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1594902918301-CreateIndexStoppedAt.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; - -import config from '@/config'; - -export class CreateIndexStoppedAt1594902918301 implements MigrationInterface { - name = 'CreateIndexStoppedAt1594902918301'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateIndexStoppedAt1594902918301 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'CREATE INDEX `IDX_' + tablePrefix + @@ -17,9 +11,7 @@ export class CreateIndexStoppedAt1594902918301 implements MigrationInterface { ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'DROP INDEX `IDX_' + tablePrefix + diff --git a/packages/cli/src/databases/migrations/mysqldb/1607431743767-MakeStoppedAtNullable.ts b/packages/cli/src/databases/migrations/mysqldb/1607431743767-MakeStoppedAtNullable.ts index b149d5e100a60..2d9e1efd41a95 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1607431743767-MakeStoppedAtNullable.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1607431743767-MakeStoppedAtNullable.ts @@ -1,21 +1,15 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -import config from '@/config'; - -export class MakeStoppedAtNullable1607431743767 implements MigrationInterface { - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +export class MakeStoppedAtNullable1607431743767 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + 'execution_entity` MODIFY `stoppedAt` datetime', - undefined, ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + 'execution_entity` MODIFY `stoppedAt` datetime NOT NULL', - undefined, ); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1611149998770-AddWebhookId.ts b/packages/cli/src/databases/migrations/mysqldb/1611149998770-AddWebhookId.ts index c3b10def61b63..bbccd94ed2581 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1611149998770-AddWebhookId.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1611149998770-AddWebhookId.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class AddWebhookId1611149998770 implements MigrationInterface { - name = 'AddWebhookId1611149998770'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddWebhookId1611149998770 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + 'webhook_entity` ADD `webhookId` varchar(255) NULL', ); @@ -22,9 +17,7 @@ export class AddWebhookId1611149998770 implements MigrationInterface { ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'DROP INDEX `IDX_' + tablePrefix + diff --git a/packages/cli/src/databases/migrations/mysqldb/1615306975123-ChangeDataSize.ts b/packages/cli/src/databases/migrations/mysqldb/1615306975123-ChangeDataSize.ts index 953fef8bcb1d6..211dee64e7522 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1615306975123-ChangeDataSize.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1615306975123-ChangeDataSize.ts @@ -1,20 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class ChangeDataSize1615306975123 implements MigrationInterface { - name = 'ChangeDataSize1615306975123'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class ChangeDataSize1615306975123 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + 'execution_entity` MODIFY COLUMN `data` MEDIUMTEXT NOT NULL', ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + 'execution_entity` MODIFY COLUMN `data` TEXT NOT NULL', ); diff --git a/packages/cli/src/databases/migrations/mysqldb/1617268711084-CreateTagEntity.ts b/packages/cli/src/databases/migrations/mysqldb/1617268711084-CreateTagEntity.ts index 7d4d752129998..986db2d110ffe 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1617268711084-CreateTagEntity.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1617268711084-CreateTagEntity.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class CreateTagEntity1617268711084 implements MigrationInterface { - name = 'CreateTagEntity1617268711084'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateTagEntity1617268711084 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { // create tags table + relationship with workflow entity await queryRunner.query( @@ -78,9 +73,7 @@ export class CreateTagEntity1617268711084 implements MigrationInterface { ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { // `createdAt` and `updatedAt` await queryRunner.query( diff --git a/packages/cli/src/databases/migrations/mysqldb/1620729500000-ChangeCredentialDataSize.ts b/packages/cli/src/databases/migrations/mysqldb/1620729500000-ChangeCredentialDataSize.ts index 2ad39bd7b08eb..cec34715cd5e1 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1620729500000-ChangeCredentialDataSize.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1620729500000-ChangeCredentialDataSize.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class ChangeCredentialDataSize1620729500000 implements MigrationInterface { - name = 'ChangeCredentialDataSize1620729500000'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class ChangeCredentialDataSize1620729500000 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + @@ -14,9 +9,7 @@ export class ChangeCredentialDataSize1620729500000 implements MigrationInterface ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + diff --git a/packages/cli/src/databases/migrations/mysqldb/1620826335440-UniqueWorkflowNames.ts b/packages/cli/src/databases/migrations/mysqldb/1620826335440-UniqueWorkflowNames.ts index e631dc686184b..6ee333cc9abb7 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1620826335440-UniqueWorkflowNames.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1620826335440-UniqueWorkflowNames.ts @@ -1,42 +1,37 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class UniqueWorkflowNames1620826335440 implements MigrationInterface { - name = 'UniqueWorkflowNames1620826335440'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - - const workflowNames = await queryRunner.query(` - SELECT name - FROM ${tablePrefix}workflow_entity - `); +export class UniqueWorkflowNames1620826335440 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { + const workflowNames = (await queryRunner.query(` + SELECT name + FROM ${tablePrefix}workflow_entity + `)) as Array<{ name: string }>; for (const { name } of workflowNames) { const [duplicatesQuery, parameters] = queryRunner.connection.driver.escapeQueryWithParameters( - ` - SELECT id, name + ` SELECT id, name FROM ${tablePrefix}workflow_entity WHERE name = :name - ORDER BY createdAt ASC - `, + ORDER BY createdAt ASC`, { name }, {}, ); - const duplicates = await queryRunner.query(duplicatesQuery, parameters); + const duplicates = (await queryRunner.query(duplicatesQuery, parameters)) as Array<{ + id: number; + name: string; + }>; if (duplicates.length > 1) { await Promise.all( - duplicates.map(({ id, name }: { id: number; name: string }, index: number) => { - if (index === 0) return Promise.resolve(); + // eslint-disable-next-line @typescript-eslint/no-shadow + duplicates.map(async ({ id, name }, index: number) => { + if (index === 0) return; const [updateQuery, updateParams] = queryRunner.connection.driver.escapeQueryWithParameters( - ` - UPDATE ${tablePrefix}workflow_entity - SET name = :name - WHERE id = '${id}' - `, + `UPDATE ${tablePrefix}workflow_entity + SET name = :name + WHERE id = '${id}'`, { name: `${name} ${index + 1}` }, {}, ); @@ -56,9 +51,7 @@ export class UniqueWorkflowNames1620826335440 implements MigrationInterface { ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + diff --git a/packages/cli/src/databases/migrations/mysqldb/1623936588000-CertifyCorrectCollation.ts b/packages/cli/src/databases/migrations/mysqldb/1623936588000-CertifyCorrectCollation.ts index 01bb084ebe65a..27ef69edc345e 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1623936588000-CertifyCorrectCollation.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1623936588000-CertifyCorrectCollation.ts @@ -1,30 +1,22 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; -export class CertifyCorrectCollation1623936588000 implements MigrationInterface { - name = 'CertifyCorrectCollation1623936588000'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - const databaseType = config.getEnv('database.type'); - - if (databaseType === 'mariadb') { +export class CertifyCorrectCollation1623936588000 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix, dbType, dbName }: MigrationContext) { + if (dbType === 'mariadb') { // This applies to MySQL only. return; } - const checkCollationExistence = await queryRunner.query( - `show collation where collation like 'utf8mb4_0900_ai_ci';`, - ); + const checkCollationExistence = (await queryRunner.query( + "show collation where collation like 'utf8mb4_0900_ai_ci';", + )) as unknown[]; let collation = 'utf8mb4_general_ci'; if (checkCollationExistence.length > 0) { collation = 'utf8mb4_0900_ai_ci'; } - const databaseName = config.getEnv(`database.mysqldb.database`); - await queryRunner.query( - `ALTER DATABASE \`${databaseName}\` CHARACTER SET utf8mb4 COLLATE ${collation};`, + `ALTER DATABASE \`${dbName}\` CHARACTER SET utf8mb4 COLLATE ${collation};`, ); for (const tableName of [ @@ -41,9 +33,6 @@ export class CertifyCorrectCollation1623936588000 implements MigrationInterface } } - async down(queryRunner: QueryRunner): Promise { - // There is nothing to undo in this case as we already expect default collation to be utf8mb4 - // This migration exists simply to enforce that n8n will work with - // older mysql versions - } + // There is no down migration in this case as we already expect default collation to be utf8mb4 + // The up migration exists simply to enforce that n8n will work with older mysql versions } diff --git a/packages/cli/src/databases/migrations/mysqldb/1626183952959-AddWaitColumn.ts b/packages/cli/src/databases/migrations/mysqldb/1626183952959-AddWaitColumn.ts index cada1259072f6..86adde6058392 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1626183952959-AddWaitColumn.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1626183952959-AddWaitColumn.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class AddWaitColumnId1626183952959 implements MigrationInterface { - name = 'AddWaitColumnId1626183952959'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddWaitColumnId1626183952959 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + 'execution_entity` ADD `waitTill` DATETIME NULL', ); @@ -19,9 +14,7 @@ export class AddWaitColumnId1626183952959 implements MigrationInterface { ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'DROP INDEX `IDX_' + tablePrefix + diff --git a/packages/cli/src/databases/migrations/mysqldb/1630451444017-UpdateWorkflowCredentials.ts b/packages/cli/src/databases/migrations/mysqldb/1630451444017-UpdateWorkflowCredentials.ts index 63a102496fd8e..083dc58ae5700 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1630451444017-UpdateWorkflowCredentials.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1630451444017-UpdateWorkflowCredentials.ts @@ -1,20 +1,21 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { runInBatches } from '@db/utils/migrationHelpers'; // replacing the credentials in workflows and execution // `nodeType: name` changes to `nodeType: { id, name }` -export class UpdateWorkflowCredentials1630451444017 implements MigrationInterface { - name = 'UpdateWorkflowCredentials1630451444017'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - - const credentialsEntities = await queryRunner.query(` +export class UpdateWorkflowCredentials1630451444017 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { + const credentialsEntities = (await queryRunner.query(` SELECT id, name, type FROM ${tablePrefix}credentials_entity - `); + `)) as Array<{ id: string; name: string; type: string }>; const workflowsQuery = ` SELECT id, nodes @@ -54,7 +55,7 @@ export class UpdateWorkflowCredentials1630451444017 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -97,7 +98,7 @@ export class UpdateWorkflowCredentials1630451444017 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -140,18 +141,16 @@ export class UpdateWorkflowCredentials1630451444017 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - - const credentialsEntities = await queryRunner.query(` + async down({ queryRunner, tablePrefix }: MigrationContext) { + const credentialsEntities = (await queryRunner.query(` SELECT id, name, type FROM ${tablePrefix}credentials_entity - `); + `)) as Array<{ id: string; name: string; type: string }>; const workflowsQuery = ` SELECT id, nodes @@ -195,7 +194,7 @@ export class UpdateWorkflowCredentials1630451444017 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -244,7 +243,7 @@ export class UpdateWorkflowCredentials1630451444017 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -293,7 +292,7 @@ export class UpdateWorkflowCredentials1630451444017 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); } diff --git a/packages/cli/src/databases/migrations/mysqldb/1644424784709-AddExecutionEntityIndexes.ts b/packages/cli/src/databases/migrations/mysqldb/1644424784709-AddExecutionEntityIndexes.ts index d5252eb0b7a76..aaa493fb81640 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1644424784709-AddExecutionEntityIndexes.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1644424784709-AddExecutionEntityIndexes.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class AddExecutionEntityIndexes1644424784709 implements MigrationInterface { - name = 'AddExecutionEntityIndexes1644424784709'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddExecutionEntityIndexes1644424784709 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `DROP INDEX \`IDX_${tablePrefix}c4d999a5e90784e8caccf5589d\` ON \`${tablePrefix}execution_entity\``, ); @@ -30,8 +25,7 @@ export class AddExecutionEntityIndexes1644424784709 implements MigrationInterfac ); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `DROP INDEX \`IDX_${tablePrefix}81fc04c8a17de15835713505e4\` ON \`${tablePrefix}execution_entity\``, ); diff --git a/packages/cli/src/databases/migrations/mysqldb/1646992772331-CreateUserManagement.ts b/packages/cli/src/databases/migrations/mysqldb/1646992772331-CreateUserManagement.ts index ed46e004f037d..89e94181d3d66 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1646992772331-CreateUserManagement.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1646992772331-CreateUserManagement.ts @@ -1,14 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; +import type { InsertResult, MigrationContext, ReversibleMigration } from '@db/types'; import { v4 as uuid } from 'uuid'; -import config from '@/config'; import { loadSurveyFromDisk } from '@db/utils/migrationHelpers'; -export class CreateUserManagement1646992772331 implements MigrationInterface { - name = 'CreateUserManagement1646992772331'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - +export class CreateUserManagement1646992772331 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}role ( \`id\` int NOT NULL AUTO_INCREMENT, @@ -114,7 +109,9 @@ export class CreateUserManagement1646992772331 implements MigrationInterface { `INSERT INTO ${tablePrefix}role (name, scope) VALUES ("owner", "global");`, ); - const instanceOwnerRole = await queryRunner.query('SELECT LAST_INSERT_ID() as insertId'); + const instanceOwnerRole = (await queryRunner.query( + 'SELECT LAST_INSERT_ID() as insertId', + )) as InsertResult; await queryRunner.query( `INSERT INTO ${tablePrefix}role (name, scope) VALUES ("member", "global");`, @@ -124,13 +121,17 @@ export class CreateUserManagement1646992772331 implements MigrationInterface { `INSERT INTO ${tablePrefix}role (name, scope) VALUES ("owner", "workflow");`, ); - const workflowOwnerRole = await queryRunner.query('SELECT LAST_INSERT_ID() as insertId'); + const workflowOwnerRole = (await queryRunner.query( + 'SELECT LAST_INSERT_ID() as insertId', + )) as InsertResult; await queryRunner.query( `INSERT INTO ${tablePrefix}role (name, scope) VALUES ("owner", "credential");`, ); - const credentialOwnerRole = await queryRunner.query('SELECT LAST_INSERT_ID() as insertId'); + const credentialOwnerRole = (await queryRunner.query( + 'SELECT LAST_INSERT_ID() as insertId', + )) as InsertResult; const survey = loadSurveyFromDisk(); @@ -155,9 +156,7 @@ export class CreateUserManagement1646992772331 implements MigrationInterface { ); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD UNIQUE INDEX \`IDX_${tablePrefix}943d8f922be094eb507cb9a7f9\` (\`name\`)`, ); diff --git a/packages/cli/src/databases/migrations/mysqldb/1648740597343-LowerCaseUserEmail.ts b/packages/cli/src/databases/migrations/mysqldb/1648740597343-LowerCaseUserEmail.ts index 47decf46deb77..aa4804357b4ec 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1648740597343-LowerCaseUserEmail.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1648740597343-LowerCaseUserEmail.ts @@ -1,17 +1,10 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class LowerCaseUserEmail1648740597343 implements MigrationInterface { - name = 'LowerCaseUserEmail1648740597343'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.get('database.tablePrefix'); +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +export class LowerCaseUserEmail1648740597343 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` UPDATE ${tablePrefix}user SET email = LOWER(email); `); } - - public async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/mysqldb/1652254514003-CommunityNodes.ts b/packages/cli/src/databases/migrations/mysqldb/1652254514003-CommunityNodes.ts index 0632e8de5aa9f..1b3b270689f5c 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1652254514003-CommunityNodes.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1652254514003-CommunityNodes.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class CommunityNodes1652254514003 implements MigrationInterface { - name = 'CommunityNodes1652254514003'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CommunityNodes1652254514003 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE \`${tablePrefix}installed_packages\` (` + '`packageName` char(214) NOT NULL,' + @@ -35,9 +30,7 @@ export class CommunityNodes1652254514003 implements MigrationInterface { ); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD UNIQUE INDEX \`IDX_${tablePrefix}943d8f922be094eb507cb9a7f9\` (\`name\`)`, ); diff --git a/packages/cli/src/databases/migrations/mysqldb/1652367743993-AddUserSettings.ts b/packages/cli/src/databases/migrations/mysqldb/1652367743993-AddUserSettings.ts index ccbaad072db0e..33020e7545a72 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1652367743993-AddUserSettings.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1652367743993-AddUserSettings.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class AddUserSettings1652367743993 implements MigrationInterface { - name = 'AddUserSettings1652367743993'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddUserSettings1652367743993 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + 'user` ADD COLUMN `settings` json NULL DEFAULT NULL', ); @@ -17,9 +12,7 @@ export class AddUserSettings1652367743993 implements MigrationInterface { ); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query('ALTER TABLE `' + tablePrefix + 'user` DROP COLUMN `settings`'); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1652905585850-AddAPIKeyColumn.ts b/packages/cli/src/databases/migrations/mysqldb/1652905585850-AddAPIKeyColumn.ts index 4e51d9156f7fd..ba390d3f6cfa9 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1652905585850-AddAPIKeyColumn.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1652905585850-AddAPIKeyColumn.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class AddAPIKeyColumn1652905585850 implements MigrationInterface { - name = 'AddAPIKeyColumn1652905585850'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddAPIKeyColumn1652905585850 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE `' + tablePrefix + 'user` ADD COLUMN `apiKey` VARCHAR(255)', ); @@ -19,8 +14,7 @@ export class AddAPIKeyColumn1652905585850 implements MigrationInterface { ); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.get('database.tablePrefix'); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `DROP INDEX \`UQ_${tablePrefix}ie0zomxves9w3p774drfrkxtj5\` ON \`${tablePrefix}user\``, ); diff --git a/packages/cli/src/databases/migrations/mysqldb/1654090101303-IntroducePinData.ts b/packages/cli/src/databases/migrations/mysqldb/1654090101303-IntroducePinData.ts index 57fdccfa0f1a2..4d0eb25ec3964 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1654090101303-IntroducePinData.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1654090101303-IntroducePinData.ts @@ -1,23 +1,11 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class IntroducePinData1654090101303 implements MigrationInterface { - name = 'IntroducePinData1654090101303'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class IntroducePinData1654090101303 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE \`${tablePrefix}workflow_entity\` ADD \`pinData\` json`); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` DROP COLUMN \`pinData\``, ); diff --git a/packages/cli/src/databases/migrations/mysqldb/1658932910559-AddNodeIds.ts b/packages/cli/src/databases/migrations/mysqldb/1658932910559-AddNodeIds.ts index 9e5257666569e..9900e96ca5a17 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1658932910559-AddNodeIds.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1658932910559-AddNodeIds.ts @@ -1,16 +1,16 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable n8n-local-rules/no-uncaught-json-parse */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { runInBatches } from '@db/utils/migrationHelpers'; import { v4 as uuid } from 'uuid'; // add node ids in workflow objects -export class AddNodeIds1658932910559 implements MigrationInterface { - name = 'AddNodeIds1658932910559'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - +export class AddNodeIds1658932910559 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { const workflowsQuery = ` SELECT id, nodes FROM ${tablePrefix}workflow_entity @@ -41,14 +41,12 @@ export class AddNodeIds1658932910559 implements MigrationInterface { {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); }); }); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { const workflowsQuery = ` SELECT id, nodes FROM ${tablePrefix}workflow_entity @@ -71,7 +69,7 @@ export class AddNodeIds1658932910559 implements MigrationInterface { {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); }); }); } diff --git a/packages/cli/src/databases/migrations/mysqldb/1659895550980-AddJsonKeyPinData.ts b/packages/cli/src/databases/migrations/mysqldb/1659895550980-AddJsonKeyPinData.ts index f42c0dc86e036..e5e932487f64f 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1659895550980-AddJsonKeyPinData.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1659895550980-AddJsonKeyPinData.ts @@ -1,23 +1,15 @@ -import { - logMigrationStart, - logMigrationEnd, - runInBatches, - getTablePrefix, -} from '@db/utils/migrationHelpers'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +import { runInBatches } from '@db/utils/migrationHelpers'; import { addJsonKeyToPinDataColumn } from '../sqlite/1659888469333-AddJsonKeyPinData'; -import type { MigrationInterface, QueryRunner } from 'typeorm'; /** * Convert JSON-type `pinData` column in `workflow_entity` table from * `{ [nodeName: string]: IDataObject[] }` to `{ [nodeName: string]: INodeExecutionData[] }` */ -export class AddJsonKeyPinData1659895550980 implements MigrationInterface { - name = 'AddJsonKeyPinData1659895550980'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - - const workflowTable = `${getTablePrefix()}workflow_entity`; +export class AddJsonKeyPinData1659895550980 implements IrreversibleMigration { + async up(context: MigrationContext) { + const { queryRunner, tablePrefix } = context; + const workflowTable = `${tablePrefix}workflow_entity`; const PINDATA_SELECT_QUERY = ` SELECT id, pinData @@ -34,13 +26,7 @@ export class AddJsonKeyPinData1659895550980 implements MigrationInterface { await runInBatches( queryRunner, PINDATA_SELECT_QUERY, - addJsonKeyToPinDataColumn(queryRunner, PINDATA_UPDATE_STATEMENT), + addJsonKeyToPinDataColumn(context, PINDATA_UPDATE_STATEMENT), ); - - logMigrationEnd(this.name); - } - - async down() { - // irreversible migration } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1660062385367-CreateCredentialsUserRole.ts b/packages/cli/src/databases/migrations/mysqldb/1660062385367-CreateCredentialsUserRole.ts index de061448ed337..98a8158081d8b 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1660062385367-CreateCredentialsUserRole.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1660062385367-CreateCredentialsUserRole.ts @@ -1,21 +1,14 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; - -export class CreateCredentialsUserRole1660062385367 implements MigrationInterface { - name = 'CreateCredentialsUserRole1660062385367'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateCredentialsUserRole1660062385367 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` INSERT IGNORE INTO ${tablePrefix}role (name, scope) VALUES ("user", "credential"); `); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` DELETE FROM ${tablePrefix}role WHERE name='user' AND scope='credential'; `); diff --git a/packages/cli/src/databases/migrations/mysqldb/1663755770894-CreateWorkflowsEditorRole.ts b/packages/cli/src/databases/migrations/mysqldb/1663755770894-CreateWorkflowsEditorRole.ts index 5a49e3a40e996..d11f1c5f57ae8 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1663755770894-CreateWorkflowsEditorRole.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1663755770894-CreateWorkflowsEditorRole.ts @@ -1,24 +1,14 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateWorkflowsEditorRole1663755770894 implements MigrationInterface { - name = 'CreateWorkflowsEditorRole1663755770894'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateWorkflowsEditorRole1663755770894 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` INSERT IGNORE INTO ${tablePrefix}role (name, scope) VALUES ("editor", "workflow") `); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` DELETE FROM ${tablePrefix}role WHERE name='user' AND scope='workflow'; `); diff --git a/packages/cli/src/databases/migrations/mysqldb/1664196174002-WorkflowStatistics.ts b/packages/cli/src/databases/migrations/mysqldb/1664196174002-WorkflowStatistics.ts index a4ef5f9d4bd97..f4c8e2cc0f016 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1664196174002-WorkflowStatistics.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1664196174002-WorkflowStatistics.ts @@ -1,15 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '../../utils/migrationHelpers'; -import config from '@/config'; - -export class WorkflowStatistics1664196174002 implements MigrationInterface { - name = 'WorkflowStatistics1664196174002'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class WorkflowStatistics1664196174002 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}workflow_statistics ( count INTEGER DEFAULT 0, @@ -25,13 +17,9 @@ export class WorkflowStatistics1664196174002 implements MigrationInterface { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD COLUMN dataLoaded BOOLEAN DEFAULT false`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}workflow_statistics"`); await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity DROP COLUMN dataLoaded`); } diff --git a/packages/cli/src/databases/migrations/mysqldb/1665484192213-CreateCredentialUsageTable.ts b/packages/cli/src/databases/migrations/mysqldb/1665484192213-CreateCredentialUsageTable.ts index fa060155559a4..e35185185f60d 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1665484192213-CreateCredentialUsageTable.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1665484192213-CreateCredentialUsageTable.ts @@ -1,20 +1,14 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateCredentialUsageTable1665484192213 implements MigrationInterface { - name = 'CreateCredentialUsageTable1665484192213'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateCredentialUsageTable1665484192213 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE \`${tablePrefix}credential_usage\` (` + '`workflowId` int NOT NULL,' + '`nodeId` char(200) NOT NULL,' + "`credentialId` int NOT NULL DEFAULT '1'," + - `\`createdAt\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,` + - `\`updatedAt\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,` + + '`createdAt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,' + + '`updatedAt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,' + 'PRIMARY KEY (`workflowId`, `nodeId`, `credentialId`)' + ") ENGINE='InnoDB';", ); @@ -26,13 +20,9 @@ export class CreateCredentialUsageTable1665484192213 implements MigrationInterfa await queryRunner.query( `ALTER TABLE \`${tablePrefix}credential_usage\` ADD CONSTRAINT \`FK_${tablePrefix}7ce200a20ade7ae89fa7901da896993f\` FOREIGN KEY (\`credentialId\`) REFERENCES \`${tablePrefix}credentials_entity\`(\`id\`) ON DELETE CASCADE ON UPDATE CASCADE`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}credential_usage"`); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1665754637026-RemoveCredentialUsageTable.ts b/packages/cli/src/databases/migrations/mysqldb/1665754637026-RemoveCredentialUsageTable.ts index 6849bfdfd2910..b7e86a29697bb 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1665754637026-RemoveCredentialUsageTable.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1665754637026-RemoveCredentialUsageTable.ts @@ -1,27 +1,18 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class RemoveCredentialUsageTable1665754637026 implements MigrationInterface { - name = 'RemoveCredentialUsageTable1665754637026'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +export class RemoveCredentialUsageTable1665754637026 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE \`${tablePrefix}credential_usage\``); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE \`${tablePrefix}credential_usage\` (` + '`workflowId` int NOT NULL,' + '`nodeId` char(200) NOT NULL,' + "`credentialId` int NOT NULL DEFAULT '1'," + - `\`createdAt\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,` + - `\`updatedAt\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,` + + '`createdAt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,' + + '`updatedAt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,' + 'PRIMARY KEY (`workflowId`, `nodeId`, `credentialId`)' + ") ENGINE='InnoDB';", ); diff --git a/packages/cli/src/databases/migrations/mysqldb/1669739707125-AddWorkflowVersionIdColumn.ts b/packages/cli/src/databases/migrations/mysqldb/1669739707125-AddWorkflowVersionIdColumn.ts index a752fc1b36d35..9a045ab387cb4 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1669739707125-AddWorkflowVersionIdColumn.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1669739707125-AddWorkflowVersionIdColumn.ts @@ -1,45 +1,31 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { v4 as uuidv4 } from 'uuid'; -export class AddWorkflowVersionIdColumn1669739707125 implements MigrationInterface { - name = 'AddWorkflowVersionIdColumn1669739707125'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); - +export class AddWorkflowVersionIdColumn1669739707125 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD COLUMN versionId CHAR(36)`, ); - const workflowIds: Array<{ id: number }> = await queryRunner.query(` + const workflowIds = (await queryRunner.query(` SELECT id FROM ${tablePrefix}workflow_entity - `); + `)) as Array<{ id: number }>; - workflowIds.map(({ id }) => { + for (const { id } of workflowIds) { const [updateQuery, updateParams] = queryRunner.connection.driver.escapeQueryWithParameters( - ` - UPDATE ${tablePrefix}workflow_entity - SET versionId = :versionId - WHERE id = '${id}' - `, + `UPDATE ${tablePrefix}workflow_entity + SET versionId = :versionId + WHERE id = '${id}'`, { versionId: uuidv4() }, {}, ); - return queryRunner.query(updateQuery, updateParams); - }); - - logMigrationEnd(this.name); + await queryRunner.query(updateQuery, updateParams); + } } - async down(queryRunner: QueryRunner) { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity DROP COLUMN versionId`); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1669823906994-AddTriggerCountColumn.ts b/packages/cli/src/databases/migrations/mysqldb/1669823906994-AddTriggerCountColumn.ts index f332aa08acf52..c4ae604b1bee7 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1669823906994-AddTriggerCountColumn.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1669823906994-AddTriggerCountColumn.ts @@ -1,26 +1,14 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class AddTriggerCountColumn1669823906994 implements MigrationInterface { - name = 'AddTriggerCountColumn1669823906994'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddTriggerCountColumn1669823906994 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD COLUMN triggerCount integer NOT NULL DEFAULT 0`, ); // Table will be populated by n8n startup - see ActiveWorkflowRunner.ts - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity DROP COLUMN triggerCount`); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1671535397530-MessageEventBusDestinations.ts b/packages/cli/src/databases/migrations/mysqldb/1671535397530-MessageEventBusDestinations.ts index 4f820b15812fa..0fb0eef513faf 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1671535397530-MessageEventBusDestinations.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1671535397530-MessageEventBusDestinations.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '../../utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class MessageEventBusDestinations1671535397530 implements MigrationInterface { - name = 'MessageEventBusDestinations1671535397530'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +export class MessageEventBusDestinations1671535397530 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}event_destinations (` + '`id` varchar(36) PRIMARY KEY NOT NULL,' + @@ -15,13 +10,9 @@ export class MessageEventBusDestinations1671535397530 implements MigrationInterf '`updatedAt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP' + ") ENGINE='InnoDB';", ); - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}event_destinations"`); - logMigrationEnd(this.name); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1671726148420-RemoveWorkflowDataLoadedFlag.ts b/packages/cli/src/databases/migrations/mysqldb/1671726148420-RemoveWorkflowDataLoadedFlag.ts index 471548d086e88..6b7b05f0f5457 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1671726148420-RemoveWorkflowDataLoadedFlag.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1671726148420-RemoveWorkflowDataLoadedFlag.ts @@ -1,22 +1,15 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; -import { StatisticsNames } from '@db/entities/WorkflowStatistics'; - -export class RemoveWorkflowDataLoadedFlag1671726148420 implements MigrationInterface { - name = 'RemoveWorkflowDataLoadedFlag1671726148420'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +import { StatisticsNames } from '@/databases/entities/WorkflowStatistics'; +export class RemoveWorkflowDataLoadedFlag1671726148420 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { // If any existing workflow has dataLoaded set to true, insert the relevant information to the statistics table - const workflowIds: Array<{ id: number; dataLoaded: boolean }> = await queryRunner.query(` + const workflowIds = (await queryRunner.query(` SELECT id, dataLoaded FROM ${tablePrefix}workflow_entity - `); + `)) as Array<{ id: number; dataLoaded: boolean }>; - workflowIds.map(({ id, dataLoaded }) => { + workflowIds.map(async ({ id, dataLoaded }) => { if (dataLoaded) { const [insertQuery, insertParams] = queryRunner.connection.driver.escapeQueryWithParameters( ` @@ -33,29 +26,27 @@ export class RemoveWorkflowDataLoadedFlag1671726148420 implements MigrationInter }); await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity DROP COLUMN dataLoaded`); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD COLUMN dataLoaded BOOLEAN DEFAULT false`, ); // Search through statistics for any workflows that have the dataLoaded stat - const workflowsIds: Array<{ workflowId: string }> = await queryRunner.query(` + const workflowsIds = (await queryRunner.query(` SELECT workflowId FROM ${tablePrefix}workflow_statistics WHERE name = '${StatisticsNames.dataLoaded}' - `); - workflowsIds.map(({ workflowId }) => { - return queryRunner.query(` + `)) as Array<{ workflowId: string }>; + + workflowsIds.map(async ({ workflowId }) => + queryRunner.query(` UPDATE ${tablePrefix}workflow_entity SET dataLoaded = true - WHERE id = '${workflowId}'`); - }); + WHERE id = '${workflowId}' + `), + ); await queryRunner.query( `DELETE FROM ${tablePrefix}workflow_statistics WHERE name = '${StatisticsNames.dataLoaded}'`, diff --git a/packages/cli/src/databases/migrations/mysqldb/1673268682475-DeleteExecutionsWithWorkflows.ts b/packages/cli/src/databases/migrations/mysqldb/1673268682475-DeleteExecutionsWithWorkflows.ts index 9313b1736a141..a76f1508c6716 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1673268682475-DeleteExecutionsWithWorkflows.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1673268682475-DeleteExecutionsWithWorkflows.ts @@ -1,17 +1,12 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class DeleteExecutionsWithWorkflows1673268682475 implements MigrationInterface { - name = 'DeleteExecutionsWithWorkflows1673268682475'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class DeleteExecutionsWithWorkflows1673268682475 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE \`${tablePrefix}execution_entity\` MODIFY workflowId INT`); - const workflowIds: Array<{ id: number }> = await queryRunner.query(` + const workflowIds = (await queryRunner.query(` SELECT id FROM \`${tablePrefix}workflow_entity\` - `); + `)) as Array<{ id: number }>; await queryRunner.query( `DELETE FROM \`${tablePrefix}execution_entity\` @@ -25,12 +20,9 @@ export class DeleteExecutionsWithWorkflows1673268682475 implements MigrationInte FOREIGN KEY (\`workflowId\`) REFERENCES \`${tablePrefix}workflow_entity\`(\`id\`) ON DELETE CASCADE`, ); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}execution_entity\` DROP FOREIGN KEY \`FK_${tablePrefix}execution_entity_workflowId\``, diff --git a/packages/cli/src/databases/migrations/mysqldb/1674138566000-AddStatusToExecutions.ts b/packages/cli/src/databases/migrations/mysqldb/1674138566000-AddStatusToExecutions.ts index ef41dc9758ed7..c193df2125fca 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1674138566000-AddStatusToExecutions.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1674138566000-AddStatusToExecutions.ts @@ -1,24 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class AddStatusToExecutions1674138566000 implements MigrationInterface { - name = 'AddStatusToExecutions1674138566000'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddStatusToExecutions1674138566000 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( - // 'ALTER TABLE `' + tablePrefix + 'execution_entity` ADD COLUMN `status` varchar', `ALTER TABLE \`${tablePrefix}execution_entity\` ADD COLUMN \`status\` VARCHAR(255)`, ); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE \`${tablePrefix}execution_entity\` DROP COLUMN \`status\``); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1674509946020-CreateLdapEntities.ts b/packages/cli/src/databases/migrations/mysqldb/1674509946020-CreateLdapEntities.ts index d75c58238779c..0f4bb6cb8e6a3 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1674509946020-CreateLdapEntities.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1674509946020-CreateLdapEntities.ts @@ -1,15 +1,8 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/Ldap/constants'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateLdapEntities1674509946020 implements MigrationInterface { - name = 'CreateLdapEntities1674509946020'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); +export class CreateLdapEntities1674509946020 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}user\` ADD COLUMN disabled BOOLEAN NOT NULL DEFAULT false;`, ); @@ -46,12 +39,9 @@ export class CreateLdapEntities1674509946020 implements MigrationInterface { PRIMARY KEY (\`id\`) ) ENGINE='InnoDB';`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE \`${tablePrefix}auth_provider_sync_history\``); await queryRunner.query(`DROP TABLE \`${tablePrefix}auth_identity\``); diff --git a/packages/cli/src/databases/migrations/mysqldb/1675940580449-PurgeInvalidWorkflowConnections.ts b/packages/cli/src/databases/migrations/mysqldb/1675940580449-PurgeInvalidWorkflowConnections.ts index 5acf8c8b264f4..662ab836e0769 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1675940580449-PurgeInvalidWorkflowConnections.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1675940580449-PurgeInvalidWorkflowConnections.ts @@ -1,36 +1,29 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { IConnections, INode } from 'n8n-workflow'; +import { jsonParse } from 'n8n-workflow'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; import { NodeTypes } from '@/NodeTypes'; -import { IConnections, INode } from 'n8n-workflow'; -import { getLogger } from '@/Logger'; import { Container } from 'typedi'; -export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationInterface { - name = 'PurgeInvalidWorkflowConnections1675940580449'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); - - const workflows: Array<{ +export class PurgeInvalidWorkflowConnections1675940580449 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix, migrationName, logger }: MigrationContext) { + const workflows = (await queryRunner.query(` + SELECT id, nodes, connections + FROM \`${tablePrefix}workflow_entity\` + `)) as Array<{ id: number; nodes: INode[] | string; connections: IConnections | string; - }> = await queryRunner.query(` - SELECT id, nodes, connections - FROM \`${tablePrefix}workflow_entity\` - `); + }>; const nodeTypes = Container.get(NodeTypes); workflows.forEach(async (workflow) => { - let connections: IConnections = + const connections = typeof workflow.connections === 'string' - ? JSON.parse(workflow.connections) + ? jsonParse(workflow.connections) : workflow.connections; - const nodes: INode[] = - typeof workflow.nodes === 'string' ? JSON.parse(workflow.nodes) : workflow.nodes; + const nodes = + typeof workflow.nodes === 'string' ? jsonParse(workflow.nodes) : workflow.nodes; const nodesThatCannotReceiveInput: string[] = nodes.reduce((acc, node) => { try { @@ -39,7 +32,7 @@ export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationIn acc.push(node.name); } } catch (error) { - getLogger().warn(`Migration ${this.name} failed with error: ${error.message}`); + logger.warn(`Migration ${migrationName} failed with error: ${(error as Error).message}`); } return acc; }, [] as string[]); @@ -48,7 +41,7 @@ export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationIn const connection = connections[sourceNodeName]; const outputs = Object.keys(connection); - outputs.forEach((outputConnectionName /* Like `main` */, idx) => { + outputs.forEach((outputConnectionName /* Like `main` */) => { const outputConnection = connection[outputConnectionName]; // It filters out all connections that are connected to a node that cannot receive input @@ -63,22 +56,14 @@ export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationIn // Update database with new connections const [updateQuery, updateParams] = queryRunner.connection.driver.escapeQueryWithParameters( - ` - UPDATE \`${tablePrefix}workflow_entity\` - SET connections = :connections - WHERE id = '${workflow.id}' - `, + `UPDATE \`${tablePrefix}workflow_entity\` + SET connections = :connections + WHERE id = '${workflow.id}'`, { connections: JSON.stringify(connections) }, {}, ); await queryRunner.query(updateQuery, updateParams); }); - - logMigrationEnd(this.name); - } - - async down(queryRunner: QueryRunner): Promise { - // No need to revert this migration } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1676996103000-MigrateExecutionStatus.ts b/packages/cli/src/databases/migrations/mysqldb/1676996103000-MigrateExecutionStatus.ts index 6c196148fc571..38a51292d426a 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1676996103000-MigrateExecutionStatus.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1676996103000-MigrateExecutionStatus.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class MigrateExecutionStatus1676996103000 implements MigrationInterface { - name = 'MigrateExecutionStatus1676996103000'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +export class MigrateExecutionStatus1676996103000 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `UPDATE \`${tablePrefix}execution_entity\` SET status='waiting' WHERE status IS NULL AND \`waitTill\` IS NOT NULL;`, ); @@ -20,9 +14,5 @@ export class MigrateExecutionStatus1676996103000 implements MigrationInterface { await queryRunner.query( `UPDATE \`${tablePrefix}execution_entity\` SET status='crashed' WHERE status IS NULL;`, ); - - logMigrationEnd(this.name); } - - public async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/mysqldb/1677236788851-UpdateRunningExecutionStatus.ts b/packages/cli/src/databases/migrations/mysqldb/1677236788851-UpdateRunningExecutionStatus.ts index 12225e7623e01..16ac4c606b71a 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1677236788851-UpdateRunningExecutionStatus.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1677236788851-UpdateRunningExecutionStatus.ts @@ -1,22 +1,12 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class UpdateRunningExecutionStatus1677236788851 implements MigrationInterface { - name = 'UpdateRunningExecutionStatus1677236788851'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +export class UpdateRunningExecutionStatus1677236788851 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `UPDATE \`${tablePrefix}execution_entity\` SET status='failed' WHERE status = 'running' AND finished=0 AND \`stoppedAt\` IS NOT NULL;`, ); await queryRunner.query( `UPDATE \`${tablePrefix}execution_entity\` SET status='success' WHERE status = 'running' AND finished=1 AND \`stoppedAt\` IS NOT NULL;`, ); - - logMigrationEnd(this.name); } - - public async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/mysqldb/1677501636753-CreateVariables.ts b/packages/cli/src/databases/migrations/mysqldb/1677501636753-CreateVariables.ts index 1e35fe5574518..08df64dcfb005 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1677501636753-CreateVariables.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1677501636753-CreateVariables.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart, getTablePrefix } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class CreateVariables1677501636753 implements MigrationInterface { - name = 'CreateVariables1677501636753'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateVariables1677501636753 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` CREATE TABLE ${tablePrefix}variables ( id int(11) auto_increment NOT NULL PRIMARY KEY, @@ -18,16 +12,9 @@ export class CreateVariables1677501636753 implements MigrationInterface { ) ENGINE=InnoDB; `); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE ${tablePrefix}variables;`); - - logMigrationEnd(this.name); } } diff --git a/packages/cli/src/databases/migrations/mysqldb/1679416281779-CreateExecutionMetadataTable.ts b/packages/cli/src/databases/migrations/mysqldb/1679416281779-CreateExecutionMetadataTable.ts index 89a53d340e280..4a601af7ca5f4 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1679416281779-CreateExecutionMetadataTable.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1679416281779-CreateExecutionMetadataTable.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner, Table } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateExecutionMetadataTable1679416281779 implements MigrationInterface { - name = 'CreateExecutionMetadataTable1679416281779'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateExecutionMetadataTable1679416281779 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}execution_metadata ( id int(11) auto_increment NOT NULL PRIMARY KEY, @@ -38,13 +32,9 @@ export class CreateExecutionMetadataTable1679416281779 implements MigrationInter await queryRunner.query( `CREATE INDEX \`IDX_${tablePrefix}8b6f3f9ae234f137d707b98f3bf43584\` ON \`${tablePrefix}execution_entity\` (\`status\`, \`workflowId\`)`, ); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}execution_metadata"`); await queryRunner.query( `CREATE INDEX \`IDX_${tablePrefix}06da892aaf92a48e7d3e400003\` ON \`${tablePrefix}execution_entity\` (\`workflowId\`, \`waitTill\`, \`id\`)`, diff --git a/packages/cli/src/databases/migrations/mysqldb/1681134145996-AddUserActivatedProperty.ts b/packages/cli/src/databases/migrations/mysqldb/1681134145996-AddUserActivatedProperty.ts index b08c384c29e14..d3b6b2f72c9e5 100644 --- a/packages/cli/src/databases/migrations/mysqldb/1681134145996-AddUserActivatedProperty.ts +++ b/packages/cli/src/databases/migrations/mysqldb/1681134145996-AddUserActivatedProperty.ts @@ -1,16 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import type { UserSettings } from '@/Interfaces'; -export class AddUserActivatedProperty1681134145996 implements MigrationInterface { - name = 'AddUserActivatedProperty1681134145996'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); - - const activatedUsers: UserSettings[] = await queryRunner.query( +export class AddUserActivatedProperty1681134145996 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { + const activatedUsers = (await queryRunner.query( `SELECT DISTINCT sw.userId AS id, JSON_SET(COALESCE(u.settings, '{}'), '$.userActivated', true) AS settings FROM ${tablePrefix}workflow_statistics AS ws @@ -23,15 +16,15 @@ export class AddUserActivatedProperty1681134145996 implements MigrationInterface WHERE ws.name = 'production_success' AND r.name = 'owner' AND r.scope = 'workflow'`, - ); + )) as UserSettings[]; - const updatedUsers = activatedUsers.map((user) => { + const updatedUsers = activatedUsers.map(async (user) => { /* MariaDB returns settings as a string and MySQL as a JSON */ const userSettings = typeof user.settings === 'string' ? user.settings : JSON.stringify(user.settings); - queryRunner.query( + await queryRunner.query( `UPDATE ${tablePrefix}user SET settings = '${userSettings}' WHERE id = '${user.id}' `, ); }); @@ -49,12 +42,9 @@ export class AddUserActivatedProperty1681134145996 implements MigrationInterface `UPDATE ${tablePrefix}user SET settings = JSON_SET(COALESCE(settings, '{}'), '$.userActivated', false) WHERE id NOT IN (${activatedUserIds})`, ); } - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `UPDATE ${tablePrefix}user SET settings = JSON_REMOVE(settings, '$.userActivated')`, ); diff --git a/packages/cli/src/databases/migrations/mysqldb/index.ts b/packages/cli/src/databases/migrations/mysqldb/index.ts index 3f53f8b24af55..18542624f36e2 100644 --- a/packages/cli/src/databases/migrations/mysqldb/index.ts +++ b/packages/cli/src/databases/migrations/mysqldb/index.ts @@ -1,3 +1,4 @@ +import type { Migration } from '@db/types'; import { InitialMigration1588157391238 } from './1588157391238-InitialMigration'; import { WebhookModel1592447867632 } from './1592447867632-WebhookModel'; import { CreateIndexStoppedAt1594902918301 } from './1594902918301-CreateIndexStoppedAt'; @@ -38,7 +39,7 @@ import { CreateExecutionMetadataTable1679416281779 } from './1679416281779-Creat import { CreateVariables1677501636753 } from './1677501636753-CreateVariables'; import { AddUserActivatedProperty1681134145996 } from './1681134145996-AddUserActivatedProperty'; -export const mysqlMigrations = [ +export const mysqlMigrations: Migration[] = [ InitialMigration1588157391238, WebhookModel1592447867632, CreateIndexStoppedAt1594902918301, diff --git a/packages/cli/src/databases/migrations/postgresdb/1587669153312-InitialMigration.ts b/packages/cli/src/databases/migrations/postgresdb/1587669153312-InitialMigration.ts index e1607a773241f..7d3c948e1ee82 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1587669153312-InitialMigration.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1587669153312-InitialMigration.ts @@ -1,41 +1,29 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; - -export class InitialMigration1587669153312 implements MigrationInterface { - name = 'InitialMigration1587669153312'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class InitialMigration1587669153312 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE IF NOT EXISTS ${tablePrefix}credentials_entity ("id" SERIAL NOT NULL, "name" character varying(128) NOT NULL, "data" text NOT NULL, "type" character varying(32) NOT NULL, "nodesAccess" json NOT NULL, "createdAt" TIMESTAMP NOT NULL, "updatedAt" TIMESTAMP NOT NULL, CONSTRAINT PK_${tablePrefix}814c3d3c36e8a27fa8edb761b0e PRIMARY KEY ("id"))`, - undefined, ); await queryRunner.query( `CREATE INDEX IF NOT EXISTS IDX_${tablePrefix}07fde106c0b471d8cc80a64fc8 ON ${tablePrefix}credentials_entity (type) `, - undefined, ); await queryRunner.query( `CREATE TABLE IF NOT EXISTS ${tablePrefix}execution_entity ("id" SERIAL NOT NULL, "data" text NOT NULL, "finished" boolean NOT NULL, "mode" character varying NOT NULL, "retryOf" character varying, "retrySuccessId" character varying, "startedAt" TIMESTAMP NOT NULL, "stoppedAt" TIMESTAMP NOT NULL, "workflowData" json NOT NULL, "workflowId" character varying, CONSTRAINT PK_${tablePrefix}e3e63bbf986767844bbe1166d4e PRIMARY KEY ("id"))`, - undefined, ); await queryRunner.query( `CREATE INDEX IF NOT EXISTS IDX_${tablePrefix}c4d999a5e90784e8caccf5589d ON ${tablePrefix}execution_entity ("workflowId") `, - undefined, ); await queryRunner.query( `CREATE TABLE IF NOT EXISTS ${tablePrefix}workflow_entity ("id" SERIAL NOT NULL, "name" character varying(128) NOT NULL, "active" boolean NOT NULL, "nodes" json NOT NULL, "connections" json NOT NULL, "createdAt" TIMESTAMP NOT NULL, "updatedAt" TIMESTAMP NOT NULL, "settings" json, "staticData" json, CONSTRAINT PK_${tablePrefix}eded7d72664448da7745d551207 PRIMARY KEY ("id"))`, - undefined, ); } - async down(queryRunner: QueryRunner): Promise { - let tablePrefix = getTablePrefix(); - - await queryRunner.query(`DROP TABLE ${tablePrefix}workflow_entity`, undefined); - await queryRunner.query(`DROP INDEX IDX_${tablePrefix}c4d999a5e90784e8caccf5589d`, undefined); - await queryRunner.query(`DROP TABLE ${tablePrefix}execution_entity`, undefined); - await queryRunner.query(`DROP INDEX IDX_${tablePrefix}07fde106c0b471d8cc80a64fc8`, undefined); - await queryRunner.query(`DROP TABLE ${tablePrefix}credentials_entity`, undefined); + async down({ queryRunner, tablePrefix }: MigrationContext) { + await queryRunner.query(`DROP TABLE ${tablePrefix}workflow_entity`); + await queryRunner.query(`DROP INDEX IDX_${tablePrefix}c4d999a5e90784e8caccf5589d`); + await queryRunner.query(`DROP TABLE ${tablePrefix}execution_entity`); + await queryRunner.query(`DROP INDEX IDX_${tablePrefix}07fde106c0b471d8cc80a64fc8`); + await queryRunner.query(`DROP TABLE ${tablePrefix}credentials_entity`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1589476000887-WebhookModel.ts b/packages/cli/src/databases/migrations/postgresdb/1589476000887-WebhookModel.ts index 6e91124b2ed6b..3b1617a098dfd 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1589476000887-WebhookModel.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1589476000887-WebhookModel.ts @@ -1,19 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class WebhookModel1589476000887 implements MigrationInterface { - name = 'WebhookModel1589476000887'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +export class WebhookModel1589476000887 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE IF NOT EXISTS ${tablePrefix}webhook_entity ("workflowId" integer NOT NULL, "webhookPath" character varying NOT NULL, "method" character varying NOT NULL, "node" character varying NOT NULL, CONSTRAINT "PK_${tablePrefix}b21ace2e13596ccd87dc9bf4ea6" PRIMARY KEY ("webhookPath", "method"))`, - undefined, ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - await queryRunner.query(`DROP TABLE ${tablePrefix}webhook_entity`, undefined); + async down({ queryRunner, tablePrefix }: MigrationContext) { + await queryRunner.query(`DROP TABLE ${tablePrefix}webhook_entity`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1594828256133-CreateIndexStoppedAt.ts b/packages/cli/src/databases/migrations/postgresdb/1594828256133-CreateIndexStoppedAt.ts index f8d315e54fed2..1fb468b1640ac 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1594828256133-CreateIndexStoppedAt.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1594828256133-CreateIndexStoppedAt.ts @@ -1,18 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class CreateIndexStoppedAt1594828256133 implements MigrationInterface { - name = 'CreateIndexStoppedAt1594828256133'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +export class CreateIndexStoppedAt1594828256133 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE INDEX IF NOT EXISTS IDX_${tablePrefix}33228da131bb1112247cf52a42 ON ${tablePrefix}execution_entity ("stoppedAt") `, ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX IDX_${tablePrefix}33228da131bb1112247cf52a42`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1607431743768-MakeStoppedAtNullable.ts b/packages/cli/src/databases/migrations/postgresdb/1607431743768-MakeStoppedAtNullable.ts index 809f1de2e31fa..bfedccd0cd607 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1607431743768-MakeStoppedAtNullable.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1607431743768-MakeStoppedAtNullable.ts @@ -1,18 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; -export class MakeStoppedAtNullable1607431743768 implements MigrationInterface { - name = 'MakeStoppedAtNullable1607431743768'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +export class MakeStoppedAtNullable1607431743768 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( 'ALTER TABLE ' + tablePrefix + 'execution_entity ALTER COLUMN "stoppedAt" DROP NOT NULL', - undefined, ); } - - async down(queryRunner: QueryRunner): Promise { - // Cannot be undone as column might already have null values - } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1611144599516-AddWebhookId.ts b/packages/cli/src/databases/migrations/postgresdb/1611144599516-AddWebhookId.ts index 71057557f72e5..5a5df368649b9 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1611144599516-AddWebhookId.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1611144599516-AddWebhookId.ts @@ -1,11 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class AddWebhookId1611144599516 implements MigrationInterface { - name = 'AddWebhookId1611144599516'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +export class AddWebhookId1611144599516 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}webhook_entity ADD "webhookId" character varying`, ); @@ -15,8 +11,7 @@ export class AddWebhookId1611144599516 implements MigrationInterface { ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX IDX_${tablePrefix}16f4436789e804e3e1c9eeb240`); await queryRunner.query(`ALTER TABLE ${tablePrefix}webhook_entity DROP COLUMN "pathLength"`); await queryRunner.query(`ALTER TABLE ${tablePrefix}webhook_entity DROP COLUMN "webhookId"`); diff --git a/packages/cli/src/databases/migrations/postgresdb/1617270242566-CreateTagEntity.ts b/packages/cli/src/databases/migrations/postgresdb/1617270242566-CreateTagEntity.ts index acfda7410b336..00a17d7088ec0 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1617270242566-CreateTagEntity.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1617270242566-CreateTagEntity.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; - -export class CreateTagEntity1617270242566 implements MigrationInterface { - name = 'CreateTagEntity1617270242566'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateTagEntity1617270242566 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { // create tags table + relationship with workflow entity await queryRunner.query( @@ -72,9 +67,7 @@ export class CreateTagEntity1617270242566 implements MigrationInterface { ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { // `createdAt` and `updatedAt` await queryRunner.query( diff --git a/packages/cli/src/databases/migrations/postgresdb/1620824779533-UniqueWorkflowNames.ts b/packages/cli/src/databases/migrations/postgresdb/1620824779533-UniqueWorkflowNames.ts index 54f22a8fef6f7..f0984cad820d8 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1620824779533-UniqueWorkflowNames.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1620824779533-UniqueWorkflowNames.ts @@ -1,16 +1,11 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class UniqueWorkflowNames1620824779533 implements MigrationInterface { - name = 'UniqueWorkflowNames1620824779533'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - - const workflowNames = await queryRunner.query(` - SELECT name - FROM ${tablePrefix}workflow_entity - `); +export class UniqueWorkflowNames1620824779533 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { + const workflowNames = (await queryRunner.query(` + SELECT name + FROM ${tablePrefix}workflow_entity + `)) as Array<{ name: string }>; for (const { name } of workflowNames) { const [duplicatesQuery, parameters] = queryRunner.connection.driver.escapeQueryWithParameters( @@ -24,19 +19,22 @@ export class UniqueWorkflowNames1620824779533 implements MigrationInterface { {}, ); - const duplicates = await queryRunner.query(duplicatesQuery, parameters); + const duplicates = (await queryRunner.query(duplicatesQuery, parameters)) as Array<{ + id: number; + name: string; + }>; if (duplicates.length > 1) { await Promise.all( - duplicates.map(({ id, name }: { id: number; name: string }, index: number) => { - if (index === 0) return Promise.resolve(); + // eslint-disable-next-line @typescript-eslint/no-shadow + duplicates.map(async ({ id, name }, index: number) => { + if (index === 0) return; const [updateQuery, updateParams] = queryRunner.connection.driver.escapeQueryWithParameters( - ` - UPDATE ${tablePrefix}workflow_entity - SET name = :name - WHERE id = '${id}' - `, + `UPDATE ${tablePrefix}workflow_entity + SET name = :name + WHERE id = '${id}' + `, { name: `${name} ${index + 1}` }, {}, ); @@ -52,8 +50,7 @@ export class UniqueWorkflowNames1620824779533 implements MigrationInterface { ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}a252c527c4c89237221fe2c0ab"`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1626176912946-AddwaitTill.ts b/packages/cli/src/databases/migrations/postgresdb/1626176912946-AddwaitTill.ts index 917934e7dcc59..eff0301a4ce23 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1626176912946-AddwaitTill.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1626176912946-AddwaitTill.ts @@ -1,19 +1,14 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class AddwaitTill1626176912946 implements MigrationInterface { - name = 'AddwaitTill1626176912946'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +export class AddwaitTill1626176912946 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE ${tablePrefix}execution_entity ADD "waitTill" TIMESTAMP`); await queryRunner.query( `CREATE INDEX IF NOT EXISTS IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2 ON ${tablePrefix}execution_entity ("waitTill")`, ); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2`); await queryRunner.query(`ALTER TABLE ${tablePrefix}webhook_entity DROP COLUMN "waitTill"`); } diff --git a/packages/cli/src/databases/migrations/postgresdb/1630419189837-UpdateWorkflowCredentials.ts b/packages/cli/src/databases/migrations/postgresdb/1630419189837-UpdateWorkflowCredentials.ts index 2a2f0d6898545..7a871a921be00 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1630419189837-UpdateWorkflowCredentials.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1630419189837-UpdateWorkflowCredentials.ts @@ -1,19 +1,21 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, runInBatches } from '@db/utils/migrationHelpers'; +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import type { MigrationContext, ReversibleMigration } from '@db/types'; +import { runInBatches } from '@db/utils/migrationHelpers'; // replacing the credentials in workflows and execution // `nodeType: name` changes to `nodeType: { id, name }` -export class UpdateWorkflowCredentials1630419189837 implements MigrationInterface { - name = 'UpdateWorkflowCredentials1630419189837'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - - const credentialsEntities = await queryRunner.query(` +export class UpdateWorkflowCredentials1630419189837 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { + const credentialsEntities = (await queryRunner.query(` SELECT id, name, type FROM ${tablePrefix}credentials_entity - `); + `)) as Array<{ id: string; name: string; type: string }>; const workflowsQuery = ` SELECT id, nodes @@ -53,7 +55,7 @@ export class UpdateWorkflowCredentials1630419189837 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -96,7 +98,7 @@ export class UpdateWorkflowCredentials1630419189837 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -141,18 +143,16 @@ export class UpdateWorkflowCredentials1630419189837 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - - const credentialsEntities = await queryRunner.query(` + async down({ queryRunner, tablePrefix }: MigrationContext) { + const credentialsEntities = (await queryRunner.query(` SELECT id, name, type FROM ${tablePrefix}credentials_entity - `); + `)) as Array<{ id: string; name: string; type: string }>; const workflowsQuery = ` SELECT id, nodes @@ -197,7 +197,7 @@ export class UpdateWorkflowCredentials1630419189837 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -246,7 +246,7 @@ export class UpdateWorkflowCredentials1630419189837 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -295,7 +295,7 @@ export class UpdateWorkflowCredentials1630419189837 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); } diff --git a/packages/cli/src/databases/migrations/postgresdb/1644422880309-AddExecutionEntityIndexes.ts b/packages/cli/src/databases/migrations/postgresdb/1644422880309-AddExecutionEntityIndexes.ts index 5f3d4c55f71af..7426fb0ed148c 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1644422880309-AddExecutionEntityIndexes.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1644422880309-AddExecutionEntityIndexes.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; - -export class AddExecutionEntityIndexes1644422880309 implements MigrationInterface { - name = 'AddExecutionEntityIndexes1644422880309'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddExecutionEntityIndexes1644422880309 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX IF EXISTS IDX_${tablePrefix}c4d999a5e90784e8caccf5589d`); await queryRunner.query(`DROP INDEX IF EXISTS IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2`); await queryRunner.query( @@ -29,9 +24,7 @@ export class AddExecutionEntityIndexes1644422880309 implements MigrationInterfac ); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}d160d4771aba5a0d78943edbe3"`); await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}85b981df7b444f905f8bf50747"`); await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}72ffaaab9f04c2c1f1ea86e662"`); diff --git a/packages/cli/src/databases/migrations/postgresdb/1646834195327-IncreaseTypeVarcharLimit.ts b/packages/cli/src/databases/migrations/postgresdb/1646834195327-IncreaseTypeVarcharLimit.ts index ea4e2b4896b78..576e8c80a0f87 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1646834195327-IncreaseTypeVarcharLimit.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1646834195327-IncreaseTypeVarcharLimit.ts @@ -1,15 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; -export class IncreaseTypeVarcharLimit1646834195327 implements MigrationInterface { - name = 'IncreaseTypeVarcharLimit1646834195327'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +export class IncreaseTypeVarcharLimit1646834195327 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}credentials_entity ALTER COLUMN "type" TYPE VARCHAR(128)`, ); } - - async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/postgresdb/1646992772331-CreateUserManagement.ts b/packages/cli/src/databases/migrations/postgresdb/1646992772331-CreateUserManagement.ts index 741a81f8a3c01..982596e192d92 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1646992772331-CreateUserManagement.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1646992772331-CreateUserManagement.ts @@ -1,13 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; +import type { InsertResult, MigrationContext, ReversibleMigration } from '@db/types'; import { v4 as uuid } from 'uuid'; -import { getTablePrefix, loadSurveyFromDisk } from '@db/utils/migrationHelpers'; - -export class CreateUserManagement1646992772331 implements MigrationInterface { - name = 'CreateUserManagement1646992772331'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +import { loadSurveyFromDisk } from '@db/utils/migrationHelpers'; +export class CreateUserManagement1646992772331 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}role ( "id" serial NOT NULL, @@ -92,7 +88,9 @@ export class CreateUserManagement1646992772331 implements MigrationInterface { `INSERT INTO ${tablePrefix}role (name, scope) VALUES ('owner', 'global');`, ); - const instanceOwnerRole = await queryRunner.query('SELECT lastval() as "insertId"'); + const instanceOwnerRole = (await queryRunner.query( + 'SELECT lastval() as "insertId"', + )) as InsertResult; await queryRunner.query( `INSERT INTO ${tablePrefix}role (name, scope) VALUES ('member', 'global');`, @@ -102,13 +100,17 @@ export class CreateUserManagement1646992772331 implements MigrationInterface { `INSERT INTO ${tablePrefix}role (name, scope) VALUES ('owner', 'workflow');`, ); - const workflowOwnerRole = await queryRunner.query('SELECT lastval() as "insertId"'); + const workflowOwnerRole = (await queryRunner.query( + 'SELECT lastval() as "insertId"', + )) as InsertResult; await queryRunner.query( `INSERT INTO ${tablePrefix}role (name, scope) VALUES ('owner', 'credential');`, ); - const credentialOwnerRole = await queryRunner.query('SELECT lastval() as "insertId"'); + const credentialOwnerRole = (await queryRunner.query( + 'SELECT lastval() as "insertId"', + )) as InsertResult; const survey = loadSurveyFromDisk(); @@ -133,9 +135,7 @@ export class CreateUserManagement1646992772331 implements MigrationInterface { ); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE UNIQUE INDEX "IDX_${tablePrefix}a252c527c4c89237221fe2c0ab" ON ${tablePrefix}workflow_entity ("name")`, ); diff --git a/packages/cli/src/databases/migrations/postgresdb/1648740597343-LowerCaseUserEmail.ts b/packages/cli/src/databases/migrations/postgresdb/1648740597343-LowerCaseUserEmail.ts index 31f33849ed576..2f2ee528f1e0a 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1648740597343-LowerCaseUserEmail.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1648740597343-LowerCaseUserEmail.ts @@ -1,16 +1,10 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; -export class LowerCaseUserEmail1648740597343 implements MigrationInterface { - name = 'LowerCaseUserEmail1648740597343'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +export class LowerCaseUserEmail1648740597343 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` UPDATE "${tablePrefix}user" SET email = LOWER(email); `); } - - public async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/postgresdb/1652254514002-CommunityNodes.ts b/packages/cli/src/databases/migrations/postgresdb/1652254514002-CommunityNodes.ts index a35395b15583d..f0f429627357e 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1652254514002-CommunityNodes.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1652254514002-CommunityNodes.ts @@ -1,14 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CommunityNodes1652254514002 implements MigrationInterface { - name = 'CommunityNodes1652254514002'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CommunityNodes1652254514002 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}installed_packages (` + '"packageName" VARCHAR(214) NOT NULL,' + @@ -31,11 +24,9 @@ export class CommunityNodes1652254514002 implements MigrationInterface { `CONSTRAINT "FK_${tablePrefix}73f857fc5dce682cef8a99c11dbddbc969618951" FOREIGN KEY ("package") REFERENCES ${tablePrefix}installed_packages ("packageName") ON DELETE CASCADE ON UPDATE CASCADE ` + ');', ); - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}installed_nodes"`); await queryRunner.query(`DROP TABLE "${tablePrefix}installed_packages"`); } diff --git a/packages/cli/src/databases/migrations/postgresdb/1652367743993-AddUserSettings.ts b/packages/cli/src/databases/migrations/postgresdb/1652367743993-AddUserSettings.ts index 1c4439aff28eb..d3f9ad6bdd818 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1652367743993-AddUserSettings.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1652367743993-AddUserSettings.ts @@ -1,12 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; - -export class AddUserSettings1652367743993 implements MigrationInterface { - name = 'AddUserSettings1652367743993'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddUserSettings1652367743993 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE "${tablePrefix}user" ADD COLUMN settings json`); await queryRunner.query( @@ -14,8 +9,7 @@ export class AddUserSettings1652367743993 implements MigrationInterface { ); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE "${tablePrefix}user" DROP COLUMN settings`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1652905585850-AddAPIKeyColumn.ts b/packages/cli/src/databases/migrations/postgresdb/1652905585850-AddAPIKeyColumn.ts index 2462e9556ef39..80b2876a1be18 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1652905585850-AddAPIKeyColumn.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1652905585850-AddAPIKeyColumn.ts @@ -1,19 +1,14 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class AddAPIKeyColumn1652905585850 implements MigrationInterface { - name = 'AddAPIKeyColumn1652905585850'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +export class AddAPIKeyColumn1652905585850 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE "${tablePrefix}user" ADD COLUMN "apiKey" VARCHAR(255)`); await queryRunner.query( `CREATE UNIQUE INDEX "UQ_${tablePrefix}ie0zomxves9w3p774drfrkxtj5" ON "${tablePrefix}user" ("apiKey")`, ); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX "UQ_${tablePrefix}ie0zomxves9w3p774drfrkxtj5"`); await queryRunner.query(`ALTER TABLE "${tablePrefix}user" DROP COLUMN "apiKey"`); } diff --git a/packages/cli/src/databases/migrations/postgresdb/1654090467022-IntroducePinData.ts b/packages/cli/src/databases/migrations/postgresdb/1654090467022-IntroducePinData.ts index 651c700b1c253..3a27cc7894cc2 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1654090467022-IntroducePinData.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1654090467022-IntroducePinData.ts @@ -1,20 +1,11 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class IntroducePinData1654090467022 implements MigrationInterface { - name = 'IntroducePinData1654090467022'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); +export class IntroducePinData1654090467022 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity ADD "pinData" json`); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity DROP COLUMN "pinData"`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1658932090381-AddNodeIds.ts b/packages/cli/src/databases/migrations/postgresdb/1658932090381-AddNodeIds.ts index aad02eca8f777..493c69dce0e77 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1658932090381-AddNodeIds.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1658932090381-AddNodeIds.ts @@ -1,15 +1,16 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable n8n-local-rules/no-uncaught-json-parse */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { v4 as uuid } from 'uuid'; -import { getTablePrefix, runInBatches } from '@db/utils/migrationHelpers'; +import { runInBatches } from '@db/utils/migrationHelpers'; // add node ids in workflow objects -export class AddNodeIds1658932090381 implements MigrationInterface { - name = 'AddNodeIds1658932090381'; - - public async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - +export class AddNodeIds1658932090381 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { const workflowsQuery = ` SELECT id, nodes FROM ${tablePrefix}workflow_entity @@ -36,14 +37,12 @@ export class AddNodeIds1658932090381 implements MigrationInterface { {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); }); }); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { const workflowsQuery = ` SELECT id, nodes FROM ${tablePrefix}workflow_entity @@ -57,16 +56,14 @@ export class AddNodeIds1658932090381 implements MigrationInterface { nodes.forEach((node) => delete node.id); const [updateQuery, updateParams] = queryRunner.connection.driver.escapeQueryWithParameters( - ` - UPDATE ${tablePrefix}workflow_entity - SET nodes = :nodes - WHERE id = '${workflow.id}' - `, + `UPDATE ${tablePrefix}workflow_entity + SET nodes = :nodes + WHERE id = '${workflow.id}'`, { nodes: JSON.stringify(nodes) }, {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); }); }); } diff --git a/packages/cli/src/databases/migrations/postgresdb/1659902242948-AddJsonKeyPinData.ts b/packages/cli/src/databases/migrations/postgresdb/1659902242948-AddJsonKeyPinData.ts index 4cf7a98307301..57ca41dfb643d 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1659902242948-AddJsonKeyPinData.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1659902242948-AddJsonKeyPinData.ts @@ -1,23 +1,15 @@ -import { - getTablePrefix, - logMigrationEnd, - logMigrationStart, - runInBatches, -} from '@db/utils/migrationHelpers'; +import type { MigrationContext, IrreversibleMigration } from '@/databases/types'; +import { runInBatches } from '@db/utils/migrationHelpers'; import { addJsonKeyToPinDataColumn } from '../sqlite/1659888469333-AddJsonKeyPinData'; -import type { MigrationInterface, QueryRunner } from 'typeorm'; /** * Convert JSON-type `pinData` column in `workflow_entity` table from * `{ [nodeName: string]: IDataObject[] }` to `{ [nodeName: string]: INodeExecutionData[] }` */ -export class AddJsonKeyPinData1659902242948 implements MigrationInterface { - name = 'AddJsonKeyPinData1659902242948'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - - const workflowTable = `${getTablePrefix()}workflow_entity`; +export class AddJsonKeyPinData1659902242948 implements IrreversibleMigration { + async up(context: MigrationContext) { + const { queryRunner, tablePrefix } = context; + const workflowTable = `${tablePrefix}workflow_entity`; const PINDATA_SELECT_QUERY = ` SELECT id, "pinData" @@ -34,13 +26,7 @@ export class AddJsonKeyPinData1659902242948 implements MigrationInterface { await runInBatches( queryRunner, PINDATA_SELECT_QUERY, - addJsonKeyToPinDataColumn(queryRunner, PINDATA_UPDATE_STATEMENT), + addJsonKeyToPinDataColumn(context, PINDATA_UPDATE_STATEMENT), ); - - logMigrationEnd(this.name); - } - - async down() { - // irreversible migration } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1660062385367-CreateCredentialsUserRole.ts b/packages/cli/src/databases/migrations/postgresdb/1660062385367-CreateCredentialsUserRole.ts index 6d94c29fd12b8..0a4f3c2cd1f2c 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1660062385367-CreateCredentialsUserRole.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1660062385367-CreateCredentialsUserRole.ts @@ -1,11 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class CreateCredentialsUserRole1660062385367 implements MigrationInterface { - name = 'CreateCredentialsUserRole1660062385367'; - - async up(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); +export class CreateCredentialsUserRole1660062385367 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` INSERT INTO ${tablePrefix}role (name, scope) VALUES ('user', 'credential') @@ -13,8 +9,7 @@ export class CreateCredentialsUserRole1660062385367 implements MigrationInterfac `); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` DELETE FROM ${tablePrefix}role WHERE name='user' AND scope='credential'; `); diff --git a/packages/cli/src/databases/migrations/postgresdb/1663755770893-CreateWorkflowsEditorRole.ts b/packages/cli/src/databases/migrations/postgresdb/1663755770893-CreateWorkflowsEditorRole.ts index 74498ddd783d8..4951a637a03e2 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1663755770893-CreateWorkflowsEditorRole.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1663755770893-CreateWorkflowsEditorRole.ts @@ -1,25 +1,15 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateWorkflowsEditorRole1663755770893 implements MigrationInterface { - name = 'CreateWorkflowsEditorRole1663755770893'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateWorkflowsEditorRole1663755770893 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` INSERT INTO ${tablePrefix}role (name, scope) VALUES ('editor', 'workflow') ON CONFLICT DO NOTHING; `); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` DELETE FROM ${tablePrefix}role WHERE name='user' AND scope='workflow'; `); diff --git a/packages/cli/src/databases/migrations/postgresdb/1664196174001-WorkflowStatistics.ts b/packages/cli/src/databases/migrations/postgresdb/1664196174001-WorkflowStatistics.ts index efe835dffabf7..2dffdafd64bb2 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1664196174001-WorkflowStatistics.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1664196174001-WorkflowStatistics.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class WorkflowStatistics1664196174001 implements MigrationInterface { - name = 'WorkflowStatistics1664196174001'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class WorkflowStatistics1664196174001 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { // Create statistics table await queryRunner.query( `CREATE TABLE ${tablePrefix}workflow_statistics ( @@ -24,12 +18,9 @@ export class WorkflowStatistics1664196174001 implements MigrationInterface { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD COLUMN "dataLoaded" BOOLEAN DEFAULT false;`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE ${tablePrefix}workflow_statistics`); await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity DROP COLUMN dataLoaded`); } diff --git a/packages/cli/src/databases/migrations/postgresdb/1665484192212-CreateCredentialUsageTable.ts b/packages/cli/src/databases/migrations/postgresdb/1665484192212-CreateCredentialUsageTable.ts index d9bc4bb4edcb5..929d668d93957 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1665484192212-CreateCredentialUsageTable.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1665484192212-CreateCredentialUsageTable.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateCredentialUsageTable1665484192212 implements MigrationInterface { - name = 'CreateCredentialUsageTable1665484192212'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateCredentialUsageTable1665484192212 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}credential_usage (` + '"workflowId" int NOT NULL,' + @@ -20,13 +14,9 @@ export class CreateCredentialUsageTable1665484192212 implements MigrationInterfa `CONSTRAINT "FK_${tablePrefix}7ce200a20ade7ae89fa7901da896993f" FOREIGN KEY ("credentialId") REFERENCES ${tablePrefix}credentials_entity ("id") ON DELETE CASCADE ON UPDATE CASCADE ` + ');', ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}credential_usage"`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1665754637025-RemoveCredentialUsageTable.ts b/packages/cli/src/databases/migrations/postgresdb/1665754637025-RemoveCredentialUsageTable.ts index e5c3a6784fc32..a37236a228ae1 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1665754637025-RemoveCredentialUsageTable.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1665754637025-RemoveCredentialUsageTable.ts @@ -1,19 +1,11 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class RemoveCredentialUsageTable1665754637025 implements MigrationInterface { - name = 'RemoveCredentialUsageTable1665754637025'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +export class RemoveCredentialUsageTable1665754637025 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE ${tablePrefix}credential_usage`); - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}credential_usage (` + '"workflowId" int NOT NULL,' + diff --git a/packages/cli/src/databases/migrations/postgresdb/1669739707126-AddWorkflowVersionIdColumn.ts b/packages/cli/src/databases/migrations/postgresdb/1669739707126-AddWorkflowVersionIdColumn.ts index 207187d978f72..8cb18806684db 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1669739707126-AddWorkflowVersionIdColumn.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1669739707126-AddWorkflowVersionIdColumn.ts @@ -1,42 +1,31 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { v4 as uuidv4 } from 'uuid'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -export class AddWorkflowVersionIdColumn1669739707126 implements MigrationInterface { - name = 'AddWorkflowVersionIdColumn1669739707126'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); +export class AddWorkflowVersionIdColumn1669739707126 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD COLUMN "versionId" CHAR(36)`, ); - const workflowIds: Array<{ id: number }> = await queryRunner.query(` + const workflowIds = (await queryRunner.query(` SELECT id FROM ${tablePrefix}workflow_entity - `); + `)) as Array<{ id: number }>; - workflowIds.map(({ id }) => { + for (const { id } of workflowIds) { const [updateQuery, updateParams] = queryRunner.connection.driver.escapeQueryWithParameters( - ` - UPDATE ${tablePrefix}workflow_entity - SET "versionId" = :versionId - WHERE id = '${id}' - `, + `UPDATE ${tablePrefix}workflow_entity + SET "versionId" = :versionId + WHERE id = '${id}'`, { versionId: uuidv4() }, {}, ); - return queryRunner.query(updateQuery, updateParams); - }); - - logMigrationEnd(this.name); + await queryRunner.query(updateQuery, updateParams); + } } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity DROP COLUMN "versionId"`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1669823906995-AddTriggerCountColumn.ts b/packages/cli/src/databases/migrations/postgresdb/1669823906995-AddTriggerCountColumn.ts index 355e1e64c63e4..252acfdc5deec 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1669823906995-AddTriggerCountColumn.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1669823906995-AddTriggerCountColumn.ts @@ -1,25 +1,14 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class AddTriggerCountColumn1669823906995 implements MigrationInterface { - name = 'AddTriggerCountColumn1669823906995'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddTriggerCountColumn1669823906995 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD COLUMN "triggerCount" integer NOT NULL DEFAULT 0`, ); // Table will be populated by n8n startup - see ActiveWorkflowRunner.ts - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity DROP COLUMN "triggerCount"`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1671535397530-MessageEventBusDestinations.ts b/packages/cli/src/databases/migrations/postgresdb/1671535397530-MessageEventBusDestinations.ts index b743c165f3d1d..1082c56d242da 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1671535397530-MessageEventBusDestinations.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1671535397530-MessageEventBusDestinations.ts @@ -1,27 +1,17 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '../../utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class MessageEventBusDestinations1671535397530 implements MigrationInterface { - name = 'MessageEventBusDestinations1671535397530'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +export class MessageEventBusDestinations1671535397530 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}event_destinations (` + - `"id" UUID PRIMARY KEY NOT NULL,` + - `"destination" JSONB NOT NULL,` + - `"createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,` + - `"updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP);`, + '"id" UUID PRIMARY KEY NOT NULL,' + + '"destination" JSONB NOT NULL,' + + '"createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,' + + '"updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP);', ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}event_destinations"`); - logMigrationEnd(this.name); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1671726148421-RemoveWorkflowDataLoadedFlag.ts b/packages/cli/src/databases/migrations/postgresdb/1671726148421-RemoveWorkflowDataLoadedFlag.ts index a651c43946d25..c62dfd2c2f075 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1671726148421-RemoveWorkflowDataLoadedFlag.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1671726148421-RemoveWorkflowDataLoadedFlag.ts @@ -1,21 +1,15 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import { StatisticsNames } from '@db/entities/WorkflowStatistics'; - -export class RemoveWorkflowDataLoadedFlag1671726148421 implements MigrationInterface { - name = 'RemoveWorkflowDataLoadedFlag1671726148421'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +import { StatisticsNames } from '@/databases/entities/WorkflowStatistics'; +export class RemoveWorkflowDataLoadedFlag1671726148421 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { // If any existing workflow has dataLoaded set to true, insert the relevant information to the statistics table - const workflowIds: Array<{ id: number; dataLoaded: boolean }> = await queryRunner.query(` + const workflowIds = (await queryRunner.query(` SELECT id, "dataLoaded" FROM ${tablePrefix}workflow_entity - `); + `)) as Array<{ id: number; dataLoaded: boolean }>; - workflowIds.map(({ id, dataLoaded }) => { + workflowIds.map(async ({ id, dataLoaded }) => { if (dataLoaded) { const [insertQuery, insertParams] = queryRunner.connection.driver.escapeQueryWithParameters( ` @@ -32,24 +26,20 @@ export class RemoveWorkflowDataLoadedFlag1671726148421 implements MigrationInter }); await queryRunner.query(`ALTER TABLE ${tablePrefix}workflow_entity DROP COLUMN "dataLoaded"`); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}workflow_entity ADD COLUMN "dataLoaded" BOOLEAN DEFAULT false`, ); // Search through statistics for any workflows that have the dataLoaded stat - const workflowsIds: Array<{ workflowId: string }> = await queryRunner.query(` + const workflowsIds = (await queryRunner.query(` SELECT "workflowId" FROM ${tablePrefix}workflow_statistics WHERE name = '${StatisticsNames.dataLoaded}' - `); - workflowsIds.map(({ workflowId }) => { + `)) as Array<{ workflowId: string }>; + workflowsIds.map(async ({ workflowId }) => { return queryRunner.query(` UPDATE ${tablePrefix}workflow_entity SET "dataLoaded" = true diff --git a/packages/cli/src/databases/migrations/postgresdb/1673268682475-DeleteExecutionsWithWorkflows.ts b/packages/cli/src/databases/migrations/postgresdb/1673268682475-DeleteExecutionsWithWorkflows.ts index 08fc25d88bb03..c31c51f5a5339 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1673268682475-DeleteExecutionsWithWorkflows.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1673268682475-DeleteExecutionsWithWorkflows.ts @@ -1,20 +1,15 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class DeleteExecutionsWithWorkflows1673268682475 implements MigrationInterface { - name = 'DeleteExecutionsWithWorkflows1673268682475'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class DeleteExecutionsWithWorkflows1673268682475 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}execution_entity ALTER COLUMN "workflowId" TYPE INTEGER USING "workflowId"::integer`, ); - const workflowIds: Array<{ id: number }> = await queryRunner.query(` + const workflowIds = (await queryRunner.query(` SELECT id FROM ${tablePrefix}workflow_entity - `); + `)) as Array<{ id: number }>; await queryRunner.query( `DELETE FROM ${tablePrefix}execution_entity @@ -32,12 +27,9 @@ export class DeleteExecutionsWithWorkflows1673268682475 implements MigrationInte FOREIGN KEY ("workflowId") REFERENCES ${tablePrefix}workflow_entity ("id") ON DELETE CASCADE`, ); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}execution_entity DROP CONSTRAINT "FK_${tablePrefix}execution_entity_workflowId"`, diff --git a/packages/cli/src/databases/migrations/postgresdb/1674138566000-AddStatusToExecutions.ts b/packages/cli/src/databases/migrations/postgresdb/1674138566000-AddStatusToExecutions.ts index b8cc0e2b00d43..7c3efea2f1961 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1674138566000-AddStatusToExecutions.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1674138566000-AddStatusToExecutions.ts @@ -1,21 +1,11 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class AddStatusToExecutions1674138566000 implements MigrationInterface { - name = 'AddStatusToExecutions1674138566000'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddStatusToExecutions1674138566000 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE ${tablePrefix}execution_entity ADD COLUMN status varchar`); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE ${tablePrefix}execution_entity DROP COLUMN status`); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1674509946020-CreateLdapEntities.ts b/packages/cli/src/databases/migrations/postgresdb/1674509946020-CreateLdapEntities.ts index 478bef686eb8a..230b7e47309a7 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1674509946020-CreateLdapEntities.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1674509946020-CreateLdapEntities.ts @@ -1,15 +1,8 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/Ldap/constants'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateLdapEntities1674509946020 implements MigrationInterface { - name = 'CreateLdapEntities1674509946020'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); +export class CreateLdapEntities1674509946020 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE "${tablePrefix}user" ADD COLUMN disabled BOOLEAN NOT NULL DEFAULT false;`, ); @@ -45,12 +38,9 @@ export class CreateLdapEntities1674509946020 implements MigrationInterface { "error" TEXT );`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}auth_provider_sync_history"`); await queryRunner.query(`DROP TABLE "${tablePrefix}auth_identity"`); diff --git a/packages/cli/src/databases/migrations/postgresdb/1675940580449-PurgeInvalidWorkflowConnections.ts b/packages/cli/src/databases/migrations/postgresdb/1675940580449-PurgeInvalidWorkflowConnections.ts index 1da69497e765c..c0775c8582d4d 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1675940580449-PurgeInvalidWorkflowConnections.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1675940580449-PurgeInvalidWorkflowConnections.ts @@ -1,28 +1,19 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { IConnections, INode } from 'n8n-workflow'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; import { NodeTypes } from '@/NodeTypes'; -import { IConnections, INode } from 'n8n-workflow'; -import { getLogger } from '@/Logger'; import { Container } from 'typedi'; -export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationInterface { - name = 'PurgeInvalidWorkflowConnections1675940580449'; - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); - - const workflows: Array<{ id: number; nodes: INode[]; connections: IConnections }> = - await queryRunner.query(` +export class PurgeInvalidWorkflowConnections1675940580449 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix, migrationName, logger }: MigrationContext) { + const workflows = (await queryRunner.query(` SELECT id, nodes, connections FROM "${tablePrefix}workflow_entity" - `); + `)) as Array<{ id: number; nodes: INode[]; connections: IConnections }>; const nodeTypes = Container.get(NodeTypes); workflows.forEach(async (workflow) => { - let connections: IConnections = workflow.connections; - const nodes: INode[] = workflow.nodes; + const { connections, nodes } = workflow; const nodesThatCannotReceiveInput: string[] = nodes.reduce((acc, node) => { try { @@ -31,7 +22,7 @@ export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationIn acc.push(node.name); } } catch (error) { - getLogger().warn(`Migration ${this.name} failed with error: ${error.message}`); + logger.warn(`Migration ${migrationName} failed with error: ${(error as Error).message}`); } return acc; }, [] as string[]); @@ -40,7 +31,7 @@ export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationIn const connection = connections[sourceNodeName]; const outputs = Object.keys(connection); - outputs.forEach((outputConnectionName /* Like `main` */, idx) => { + outputs.forEach((outputConnectionName /* Like `main` */) => { const outputConnection = connection[outputConnectionName]; // It filters out all connections that are connected to a node that cannot receive input @@ -55,22 +46,14 @@ export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationIn // Update database with new connections const [updateQuery, updateParams] = queryRunner.connection.driver.escapeQueryWithParameters( - ` - UPDATE "${tablePrefix}workflow_entity" - SET connections = :connections - WHERE id = '${workflow.id}' - `, + `UPDATE "${tablePrefix}workflow_entity" + SET connections = :connections + WHERE id = '${workflow.id}'`, { connections: JSON.stringify(connections) }, {}, ); await queryRunner.query(updateQuery, updateParams); }); - - logMigrationEnd(this.name); - } - - async down(queryRunner: QueryRunner): Promise { - // No need to revert this migration } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1676996103000-MigrateExecutionStatus.ts b/packages/cli/src/databases/migrations/postgresdb/1676996103000-MigrateExecutionStatus.ts index fdfec47d7ed34..fcc82e31064b9 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1676996103000-MigrateExecutionStatus.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1676996103000-MigrateExecutionStatus.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class MigrateExecutionStatus1676996103000 implements MigrationInterface { - name = 'MigrateExecutionStatus1676996103000'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +export class MigrateExecutionStatus1676996103000 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `UPDATE "${tablePrefix}execution_entity" SET "status" = 'waiting' WHERE "status" IS NULL AND "waitTill" IS NOT NULL;`, ); @@ -20,9 +14,5 @@ export class MigrateExecutionStatus1676996103000 implements MigrationInterface { await queryRunner.query( `UPDATE "${tablePrefix}execution_entity" SET "status" = 'crashed' WHERE "status" IS NULL;`, ); - - logMigrationEnd(this.name); } - - public async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/postgresdb/1677236854063-UpdateRunningExecutionStatus.ts b/packages/cli/src/databases/migrations/postgresdb/1677236854063-UpdateRunningExecutionStatus.ts index cc017549039c8..5403732c831ce 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1677236854063-UpdateRunningExecutionStatus.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1677236854063-UpdateRunningExecutionStatus.ts @@ -1,22 +1,12 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class UpdateRunningExecutionStatus1677236854063 implements MigrationInterface { - name = 'UpdateRunningExecutionStatus1677236854063'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +export class UpdateRunningExecutionStatus1677236854063 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `UPDATE "${tablePrefix}execution_entity" SET "status" = 'failed' WHERE "status" = 'running' AND "finished"=false AND "stoppedAt" IS NOT NULL;`, ); await queryRunner.query( `UPDATE "${tablePrefix}execution_entity" SET "status" = 'success' WHERE "status" = 'running' AND "finished"=true AND "stoppedAt" IS NOT NULL;`, ); - - logMigrationEnd(this.name); } - - public async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/postgresdb/1677501636754-CreateVariables.ts b/packages/cli/src/databases/migrations/postgresdb/1677501636754-CreateVariables.ts index 59842d73b1c8d..ef0281dc22d31 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1677501636754-CreateVariables.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1677501636754-CreateVariables.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart, getTablePrefix } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class CreateVariables1677501636754 implements MigrationInterface { - name = 'CreateVariables1677501636754'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateVariables1677501636754 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` CREATE TABLE ${tablePrefix}variables ( id serial4 NOT NULL PRIMARY KEY, @@ -17,16 +11,9 @@ export class CreateVariables1677501636754 implements MigrationInterface { UNIQUE ("key") ); `); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE ${tablePrefix}variables;`); - - logMigrationEnd(this.name); } } diff --git a/packages/cli/src/databases/migrations/postgresdb/1679416281778-CreateExecutionMetadataTable.ts b/packages/cli/src/databases/migrations/postgresdb/1679416281778-CreateExecutionMetadataTable.ts index 384d3f2c03c74..ef47c075fcb9c 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1679416281778-CreateExecutionMetadataTable.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1679416281778-CreateExecutionMetadataTable.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner, Table } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateExecutionMetadataTable1679416281778 implements MigrationInterface { - name = 'CreateExecutionMetadataTable1679416281778'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateExecutionMetadataTable1679416281778 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE ${tablePrefix}execution_metadata ( "id" serial4 NOT NULL PRIMARY KEY, @@ -32,13 +26,9 @@ export class CreateExecutionMetadataTable1679416281778 implements MigrationInter await queryRunner.query( `CREATE INDEX "IDX_${tablePrefix}8b6f3f9ae234f137d707b98f3bf43584" ON "${tablePrefix}execution_entity" ("status", "workflowId");`, ); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { // Re-add removed indices await queryRunner.query( `CREATE INDEX IF NOT EXISTS "IDX_${tablePrefix}33228da131bb1112247cf52a42" ON ${tablePrefix}execution_entity ("stoppedAt") `, diff --git a/packages/cli/src/databases/migrations/postgresdb/1681134145996-AddUserActivatedProperty.ts b/packages/cli/src/databases/migrations/postgresdb/1681134145996-AddUserActivatedProperty.ts index bf4293d4ddaae..50040ea9ca69a 100644 --- a/packages/cli/src/databases/migrations/postgresdb/1681134145996-AddUserActivatedProperty.ts +++ b/packages/cli/src/databases/migrations/postgresdb/1681134145996-AddUserActivatedProperty.ts @@ -1,16 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import type { UserSettings } from '@/Interfaces'; -export class AddUserActivatedProperty1681134145996 implements MigrationInterface { - name = 'AddUserActivatedProperty1681134145996'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); - - const activatedUsers: UserSettings[] = await queryRunner.query( +export class AddUserActivatedProperty1681134145996 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { + const activatedUsers = (await queryRunner.query( `SELECT DISTINCT sw."userId" AS id, JSONB_SET(COALESCE(u.settings::jsonb, '{}'), '{userActivated}', 'true', true) as settings FROM ${tablePrefix}workflow_statistics ws @@ -23,9 +16,9 @@ export class AddUserActivatedProperty1681134145996 implements MigrationInterface WHERE ws.name = 'production_success' AND r.name = 'owner' AND r.scope = 'workflow'`, - ); + )) as UserSettings[]; - const updatedUsers = activatedUsers.map((user) => + const updatedUsers = activatedUsers.map(async (user) => queryRunner.query( `UPDATE "${tablePrefix}user" SET settings = '${JSON.stringify( user.settings, @@ -46,12 +39,9 @@ export class AddUserActivatedProperty1681134145996 implements MigrationInterface `UPDATE "${tablePrefix}user" SET settings = JSONB_SET(COALESCE(settings::jsonb, '{}'), '{userActivated}', 'false', true) WHERE id NOT IN (${activatedUserIds})`, ); } - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `UPDATE "${tablePrefix}user" SET settings = settings::jsonb - 'userActivated'`, ); diff --git a/packages/cli/src/databases/migrations/postgresdb/index.ts b/packages/cli/src/databases/migrations/postgresdb/index.ts index 231518df99249..8c047b84f240a 100644 --- a/packages/cli/src/databases/migrations/postgresdb/index.ts +++ b/packages/cli/src/databases/migrations/postgresdb/index.ts @@ -1,3 +1,4 @@ +import type { Migration } from '@db/types'; import { InitialMigration1587669153312 } from './1587669153312-InitialMigration'; import { WebhookModel1589476000887 } from './1589476000887-WebhookModel'; import { CreateIndexStoppedAt1594828256133 } from './1594828256133-CreateIndexStoppedAt'; @@ -36,7 +37,7 @@ import { CreateExecutionMetadataTable1679416281778 } from './1679416281778-Creat import { CreateVariables1677501636754 } from './1677501636754-CreateVariables'; import { AddUserActivatedProperty1681134145996 } from './1681134145996-AddUserActivatedProperty'; -export const postgresMigrations = [ +export const postgresMigrations: Migration[] = [ InitialMigration1587669153312, WebhookModel1589476000887, CreateIndexStoppedAt1594828256133, diff --git a/packages/cli/src/databases/migrations/sqlite/1588102412422-InitialMigration.ts b/packages/cli/src/databases/migrations/sqlite/1588102412422-InitialMigration.ts index 2537328036819..baf99502cc789 100644 --- a/packages/cli/src/databases/migrations/sqlite/1588102412422-InitialMigration.ts +++ b/packages/cli/src/databases/migrations/sqlite/1588102412422-InitialMigration.ts @@ -1,46 +1,29 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class InitialMigration1588102412422 implements MigrationInterface { - name = 'InitialMigration1588102412422'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class InitialMigration1588102412422 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE IF NOT EXISTS "${tablePrefix}credentials_entity" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(128) NOT NULL, "data" text NOT NULL, "type" varchar(128) NOT NULL, "nodesAccess" text NOT NULL, "createdAt" datetime NOT NULL, "updatedAt" datetime NOT NULL)`, - undefined, ); await queryRunner.query( `CREATE INDEX IF NOT EXISTS "IDX_${tablePrefix}07fde106c0b471d8cc80a64fc8" ON "${tablePrefix}credentials_entity" ("type") `, - undefined, ); await queryRunner.query( `CREATE TABLE IF NOT EXISTS "${tablePrefix}execution_entity" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "data" text NOT NULL, "finished" boolean NOT NULL, "mode" varchar NOT NULL, "retryOf" varchar, "retrySuccessId" varchar, "startedAt" datetime NOT NULL, "stoppedAt" datetime NOT NULL, "workflowData" text NOT NULL, "workflowId" varchar)`, - undefined, ); await queryRunner.query( `CREATE INDEX IF NOT EXISTS "IDX_${tablePrefix}c4d999a5e90784e8caccf5589d" ON "${tablePrefix}execution_entity" ("workflowId") `, - undefined, ); await queryRunner.query( `CREATE TABLE IF NOT EXISTS "${tablePrefix}workflow_entity" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(128) NOT NULL, "active" boolean NOT NULL, "nodes" text NOT NULL, "connections" text NOT NULL, "createdAt" datetime NOT NULL, "updatedAt" datetime NOT NULL, "settings" text, "staticData" text)`, - undefined, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - - await queryRunner.query(`DROP TABLE "${tablePrefix}workflow_entity"`, undefined); - await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}c4d999a5e90784e8caccf5589d"`, undefined); - await queryRunner.query(`DROP TABLE "${tablePrefix}execution_entity"`, undefined); - await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}07fde106c0b471d8cc80a64fc8"`, undefined); - await queryRunner.query(`DROP TABLE "${tablePrefix}credentials_entity"`, undefined); + async down({ queryRunner, tablePrefix }: MigrationContext) { + await queryRunner.query(`DROP TABLE "${tablePrefix}workflow_entity"`); + await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}c4d999a5e90784e8caccf5589d"`); + await queryRunner.query(`DROP TABLE "${tablePrefix}execution_entity"`); + await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}07fde106c0b471d8cc80a64fc8"`); + await queryRunner.query(`DROP TABLE "${tablePrefix}credentials_entity"`); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1592445003908-WebhookModel.ts b/packages/cli/src/databases/migrations/sqlite/1592445003908-WebhookModel.ts index 378abac4dc879..eddde3176272f 100644 --- a/packages/cli/src/databases/migrations/sqlite/1592445003908-WebhookModel.ts +++ b/packages/cli/src/databases/migrations/sqlite/1592445003908-WebhookModel.ts @@ -1,24 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class WebhookModel1592445003908 implements MigrationInterface { - name = 'WebhookModel1592445003908'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class WebhookModel1592445003908 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE IF NOT EXISTS ${tablePrefix}webhook_entity ("workflowId" integer NOT NULL, "webhookPath" varchar NOT NULL, "method" varchar NOT NULL, "node" varchar NOT NULL, PRIMARY KEY ("webhookPath", "method"))`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE ${tablePrefix}webhook_entity`); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1594825041918-CreateIndexStoppedAt.ts b/packages/cli/src/databases/migrations/sqlite/1594825041918-CreateIndexStoppedAt.ts index e5be8676e5fb3..b363b1623e8f5 100644 --- a/packages/cli/src/databases/migrations/sqlite/1594825041918-CreateIndexStoppedAt.ts +++ b/packages/cli/src/databases/migrations/sqlite/1594825041918-CreateIndexStoppedAt.ts @@ -1,25 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateIndexStoppedAt1594825041918 implements MigrationInterface { - name = 'CreateIndexStoppedAt1594825041918'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateIndexStoppedAt1594825041918 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE INDEX "IDX_${tablePrefix}cefb067df2402f6aed0638a6c1" ON "${tablePrefix}execution_entity" ("stoppedAt") `, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}cefb067df2402f6aed0638a6c1"`); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1607431743769-MakeStoppedAtNullable.ts b/packages/cli/src/databases/migrations/sqlite/1607431743769-MakeStoppedAtNullable.ts index 7395c92dd33ba..800d605ba6ab4 100644 --- a/packages/cli/src/databases/migrations/sqlite/1607431743769-MakeStoppedAtNullable.ts +++ b/packages/cli/src/databases/migrations/sqlite/1607431743769-MakeStoppedAtNullable.ts @@ -1,30 +1,16 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; -export class MakeStoppedAtNullable1607431743769 implements MigrationInterface { - name = 'MakeStoppedAtNullable1607431743769'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +export class MakeStoppedAtNullable1607431743769 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { // SQLite does not allow us to simply "alter column" // We're hacking the way sqlite identifies tables // Allowing a column to become nullable // This is a very strict case when this can be done safely // As no collateral effects exist. - await queryRunner.query(`PRAGMA writable_schema = 1; `, undefined); + await queryRunner.query('PRAGMA writable_schema = 1;'); await queryRunner.query( `UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE IF NOT EXISTS "${tablePrefix}execution_entity" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "data" text NOT NULL, "finished" boolean NOT NULL, "mode" varchar NOT NULL, "retryOf" varchar, "retrySuccessId" varchar, "startedAt" datetime NOT NULL, "stoppedAt" datetime, "workflowData" text NOT NULL, "workflowId" varchar)' WHERE NAME = "${tablePrefix}execution_entity";`, - undefined, ); - await queryRunner.query(`PRAGMA writable_schema = 0;`, undefined); - - logMigrationEnd(this.name); - } - - async down(queryRunner: QueryRunner): Promise { - // This cannot be undone as the table might already have nullable values + await queryRunner.query('PRAGMA writable_schema = 0;'); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1611071044839-AddWebhookId.ts b/packages/cli/src/databases/migrations/sqlite/1611071044839-AddWebhookId.ts index 71c1adbe8a8c9..8d1d64f4de698 100644 --- a/packages/cli/src/databases/migrations/sqlite/1611071044839-AddWebhookId.ts +++ b/packages/cli/src/databases/migrations/sqlite/1611071044839-AddWebhookId.ts @@ -1,17 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class AddWebhookId1611071044839 implements MigrationInterface { - name = 'AddWebhookId1611071044839'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddWebhookId1611071044839 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( - `CREATE TABLE "temporary_webhook_entity" ("workflowId" integer NOT NULL, "webhookPath" varchar NOT NULL, "method" varchar NOT NULL, "node" varchar NOT NULL, "webhookId" varchar, "pathLength" integer, PRIMARY KEY ("webhookPath", "method"))`, + 'CREATE TABLE "temporary_webhook_entity" ("workflowId" integer NOT NULL, "webhookPath" varchar NOT NULL, "method" varchar NOT NULL, "node" varchar NOT NULL, "webhookId" varchar, "pathLength" integer, PRIMARY KEY ("webhookPath", "method"))', ); await queryRunner.query( `INSERT INTO "temporary_webhook_entity"("workflowId", "webhookPath", "method", "node") SELECT "workflowId", "webhookPath", "method", "node" FROM "${tablePrefix}webhook_entity"`, @@ -23,13 +15,9 @@ export class AddWebhookId1611071044839 implements MigrationInterface { await queryRunner.query( `CREATE INDEX "IDX_${tablePrefix}742496f199721a057051acf4c2" ON "${tablePrefix}webhook_entity" ("webhookId", "method", "pathLength") `, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}742496f199721a057051acf4c2"`); await queryRunner.query( `ALTER TABLE "${tablePrefix}webhook_entity" RENAME TO "temporary_webhook_entity"`, @@ -40,6 +28,6 @@ export class AddWebhookId1611071044839 implements MigrationInterface { await queryRunner.query( `INSERT INTO "${tablePrefix}webhook_entity"("workflowId", "webhookPath", "method", "node") SELECT "workflowId", "webhookPath", "method", "node" FROM "temporary_webhook_entity"`, ); - await queryRunner.query(`DROP TABLE "temporary_webhook_entity"`); + await queryRunner.query('DROP TABLE "temporary_webhook_entity"'); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1617213344594-CreateTagEntity.ts b/packages/cli/src/databases/migrations/sqlite/1617213344594-CreateTagEntity.ts index 09b845b322ef2..314eded6d128a 100644 --- a/packages/cli/src/databases/migrations/sqlite/1617213344594-CreateTagEntity.ts +++ b/packages/cli/src/databases/migrations/sqlite/1617213344594-CreateTagEntity.ts @@ -1,15 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateTagEntity1617213344594 implements MigrationInterface { - name = 'CreateTagEntity1617213344594'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateTagEntity1617213344594 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { // create tags table + relationship with workflow entity await queryRunner.query( @@ -68,13 +60,9 @@ export class CreateTagEntity1617213344594 implements MigrationInterface { await queryRunner.query( `ALTER TABLE "${tablePrefix}temporary_workflow_entity" RENAME TO "${tablePrefix}workflow_entity"`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { // `createdAt` and `updatedAt` await queryRunner.query( diff --git a/packages/cli/src/databases/migrations/sqlite/1620821879465-UniqueWorkflowNames.ts b/packages/cli/src/databases/migrations/sqlite/1620821879465-UniqueWorkflowNames.ts index 001096b903bb7..61684fe8ddec7 100644 --- a/packages/cli/src/databases/migrations/sqlite/1620821879465-UniqueWorkflowNames.ts +++ b/packages/cli/src/databases/migrations/sqlite/1620821879465-UniqueWorkflowNames.ts @@ -1,19 +1,11 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class UniqueWorkflowNames1620821879465 implements MigrationInterface { - name = 'UniqueWorkflowNames1620821879465'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); - - const workflowNames = await queryRunner.query(` - SELECT name - FROM "${tablePrefix}workflow_entity" - `); +export class UniqueWorkflowNames1620821879465 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { + const workflowNames = (await queryRunner.query(` + SELECT name + FROM "${tablePrefix}workflow_entity" + `)) as Array<{ name: string }>; for (const { name } of workflowNames) { const [duplicatesQuery, parameters] = queryRunner.connection.driver.escapeQueryWithParameters( @@ -27,12 +19,16 @@ export class UniqueWorkflowNames1620821879465 implements MigrationInterface { {}, ); - const duplicates = await queryRunner.query(duplicatesQuery, parameters); + const duplicates = (await queryRunner.query(duplicatesQuery, parameters)) as Array<{ + id: number; + name: string; + }>; if (duplicates.length > 1) { await Promise.all( - duplicates.map(({ id, name }: { id: number; name: string }, index: number) => { - if (index === 0) return Promise.resolve(); + // eslint-disable-next-line @typescript-eslint/no-shadow + duplicates.map(async ({ id, name }, index: number) => { + if (index === 0) return; const [updateQuery, updateParams] = queryRunner.connection.driver.escapeQueryWithParameters( ` @@ -53,12 +49,9 @@ export class UniqueWorkflowNames1620821879465 implements MigrationInterface { await queryRunner.query( `CREATE UNIQUE INDEX "IDX_${tablePrefix}943d8f922be094eb507cb9a7f9" ON "${tablePrefix}workflow_entity" ("name") `, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX "IDX_${tablePrefix}943d8f922be094eb507cb9a7f9"`); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1621707690587-AddWaitColumn.ts b/packages/cli/src/databases/migrations/sqlite/1621707690587-AddWaitColumn.ts index ebe65d48819fc..95c5cd51b1e83 100644 --- a/packages/cli/src/databases/migrations/sqlite/1621707690587-AddWaitColumn.ts +++ b/packages/cli/src/databases/migrations/sqlite/1621707690587-AddWaitColumn.ts @@ -1,19 +1,10 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class AddWaitColumn1621707690587 implements MigrationInterface { - name = 'AddWaitColumn1621707690587'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddWaitColumn1621707690587 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE IF EXISTS "${tablePrefix}temporary_execution_entity"`); await queryRunner.query( `CREATE TABLE "${tablePrefix}temporary_execution_entity" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "data" text NOT NULL, "finished" boolean NOT NULL, "mode" varchar NOT NULL, "retryOf" varchar, "retrySuccessId" varchar, "startedAt" datetime NOT NULL, "stoppedAt" datetime, "workflowData" text NOT NULL, "workflowId" varchar, "waitTill" DATETIME)`, - undefined, ); await queryRunner.query( `INSERT INTO "${tablePrefix}temporary_execution_entity"("id", "data", "finished", "mode", "retryOf", "retrySuccessId", "startedAt", "stoppedAt", "workflowData", "workflowId") SELECT "id", "data", "finished", "mode", "retryOf", "retrySuccessId", "startedAt", "stoppedAt", "workflowData", "workflowId" FROM "${tablePrefix}execution_entity"`, @@ -28,16 +19,11 @@ export class AddWaitColumn1621707690587 implements MigrationInterface { await queryRunner.query( `CREATE INDEX "IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2" ON "${tablePrefix}execution_entity" ("waitTill")`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE IF NOT EXISTS "${tablePrefix}temporary_execution_entity" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "data" text NOT NULL, "finished" boolean NOT NULL, "mode" varchar NOT NULL, "retryOf" varchar, "retrySuccessId" varchar, "startedAt" datetime NOT NULL, "stoppedAt" datetime, "workflowData" text NOT NULL, "workflowId" varchar)`, - undefined, ); await queryRunner.query( `INSERT INTO "${tablePrefix}temporary_execution_entity"("id", "data", "finished", "mode", "retryOf", "retrySuccessId", "startedAt", "stoppedAt", "workflowData", "workflowId") SELECT "id", "data", "finished", "mode", "retryOf", "retrySuccessId", "startedAt", "stoppedAt", "workflowData", "workflowId" FROM "${tablePrefix}execution_entity"`, diff --git a/packages/cli/src/databases/migrations/sqlite/1630330987096-UpdateWorkflowCredentials.ts b/packages/cli/src/databases/migrations/sqlite/1630330987096-UpdateWorkflowCredentials.ts index f855575e70e7f..57d7712c94c1e 100644 --- a/packages/cli/src/databases/migrations/sqlite/1630330987096-UpdateWorkflowCredentials.ts +++ b/packages/cli/src/databases/migrations/sqlite/1630330987096-UpdateWorkflowCredentials.ts @@ -1,23 +1,22 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +/* eslint-disable n8n-local-rules/no-uncaught-json-parse */ +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { runInBatches } from '@db/utils/migrationHelpers'; // replacing the credentials in workflows and execution // `nodeType: name` changes to `nodeType: { id, name }` -export class UpdateWorkflowCredentials1630330987096 implements MigrationInterface { - name = 'UpdateWorkflowCredentials1630330987096'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); - - const credentialsEntities = await queryRunner.query(` +export class UpdateWorkflowCredentials1630330987096 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { + const credentialsEntities = (await queryRunner.query(` SELECT id, name, type FROM "${tablePrefix}credentials_entity" - `); + `)) as Array<{ id: string; name: string; type: string }>; const workflowsQuery = ` SELECT id, nodes @@ -57,7 +56,7 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -100,7 +99,7 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -143,20 +142,16 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - - const credentialsEntities = await queryRunner.query(` + async down({ queryRunner, tablePrefix }: MigrationContext) { + const credentialsEntities = (await queryRunner.query(` SELECT id, name, type FROM "${tablePrefix}credentials_entity" - `); + `)) as Array<{ id: string; name: string; type: string }>; const workflowsQuery = ` SELECT id, nodes @@ -176,7 +171,9 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac for (const [type, creds] of allNodeCredentials) { if (typeof creds === 'object') { const matchingCredentials = credentialsEntities.find( - // @ts-ignore double-equals because creds.id can be string or number + // @ts-ignore + // double-equals because creds.id can be string or number + // eslint-disable-next-line eqeqeq (credentials) => credentials.id == creds.id && credentials.type === type, ); if (matchingCredentials) { @@ -202,7 +199,7 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); }); @@ -226,7 +223,9 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac for (const [type, creds] of allNodeCredentials) { if (typeof creds === 'object') { const matchingCredentials = credentialsEntities.find( - // @ts-ignore double-equals because creds.id can be string or number + // @ts-ignore + // double-equals because creds.id can be string or number + // eslint-disable-next-line eqeqeq (credentials) => credentials.id == creds.id && credentials.type === type, ); if (matchingCredentials) { @@ -276,7 +275,9 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac for (const [type, creds] of allNodeCredentials) { if (typeof creds === 'object') { const matchingCredentials = credentialsEntities.find( - // @ts-ignore double-equals because creds.id can be string or number + // @ts-ignore + // double-equals because creds.id can be string or number + // eslint-disable-next-line eqeqeq (credentials) => credentials.id == creds.id && credentials.type === type, ); if (matchingCredentials) { @@ -301,7 +302,7 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); } }); } diff --git a/packages/cli/src/databases/migrations/sqlite/1644421939510-AddExecutionEntityIndexes.ts b/packages/cli/src/databases/migrations/sqlite/1644421939510-AddExecutionEntityIndexes.ts index a534043afc0fb..babf466f01db0 100644 --- a/packages/cli/src/databases/migrations/sqlite/1644421939510-AddExecutionEntityIndexes.ts +++ b/packages/cli/src/databases/migrations/sqlite/1644421939510-AddExecutionEntityIndexes.ts @@ -1,14 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class AddExecutionEntityIndexes1644421939510 implements MigrationInterface { - name = 'AddExecutionEntityIndexes1644421939510'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddExecutionEntityIndexes1644421939510 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}c4d999a5e90784e8caccf5589d'`); await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2'`); @@ -28,12 +21,9 @@ export class AddExecutionEntityIndexes1644421939510 implements MigrationInterfac await queryRunner.query( `CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}81fc04c8a17de15835713505e4' ON '${tablePrefix}execution_entity' ('workflowId', 'id') `, ); - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP INDEX 'IDX_${tablePrefix}81fc04c8a17de15835713505e4'`); await queryRunner.query(`DROP INDEX 'IDX_${tablePrefix}b94b45ce2c73ce46c54f20b5f9'`); await queryRunner.query(`DROP INDEX 'IDX_${tablePrefix}1688846335d274033e15c846a4'`); diff --git a/packages/cli/src/databases/migrations/sqlite/1646992772331-CreateUserManagement.ts b/packages/cli/src/databases/migrations/sqlite/1646992772331-CreateUserManagement.ts index a5282e065d8dd..42ffe1d517206 100644 --- a/packages/cli/src/databases/migrations/sqlite/1646992772331-CreateUserManagement.ts +++ b/packages/cli/src/databases/migrations/sqlite/1646992772331-CreateUserManagement.ts @@ -1,16 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; +import type { InsertResult, MigrationContext, ReversibleMigration } from '@db/types'; import { v4 as uuid } from 'uuid'; -import config from '@/config'; -import { loadSurveyFromDisk, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateUserManagement1646992772331 implements MigrationInterface { - name = 'CreateUserManagement1646992772331'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import { loadSurveyFromDisk } from '@db/utils/migrationHelpers'; +export class CreateUserManagement1646992772331 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE "${tablePrefix}role" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(32) NOT NULL, "scope" varchar NOT NULL, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "updatedAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), CONSTRAINT "UQ_${tablePrefix}5b49d0f504f7ef31045a1fb2eb8" UNIQUE ("scope", "name"))`, ); @@ -49,7 +42,9 @@ export class CreateUserManagement1646992772331 implements MigrationInterface { VALUES ("owner", "global"); `); - const instanceOwnerRole = await queryRunner.query('SELECT last_insert_rowid() as insertId'); + const instanceOwnerRole = (await queryRunner.query( + 'SELECT last_insert_rowid() as insertId', + )) as InsertResult; await queryRunner.query(` INSERT INTO "${tablePrefix}role" (name, scope) @@ -61,14 +56,18 @@ export class CreateUserManagement1646992772331 implements MigrationInterface { VALUES ("owner", "workflow"); `); - const workflowOwnerRole = await queryRunner.query('SELECT last_insert_rowid() as insertId'); + const workflowOwnerRole = (await queryRunner.query( + 'SELECT last_insert_rowid() as insertId', + )) as InsertResult; await queryRunner.query(` INSERT INTO "${tablePrefix}role" (name, scope) VALUES ("owner", "credential"); `); - const credentialOwnerRole = await queryRunner.query('SELECT last_insert_rowid() as insertId'); + const credentialOwnerRole = (await queryRunner.query( + 'SELECT last_insert_rowid() as insertId', + )) as InsertResult; const survey = loadSurveyFromDisk(); @@ -95,12 +94,9 @@ export class CreateUserManagement1646992772331 implements MigrationInterface { INSERT INTO "${tablePrefix}settings" (key, value, loadOnStartup) values ('userManagement.isInstanceOwnerSetUp', 'false', true), ('userManagement.skipInstanceOwnerSetup', 'false', true) `); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE UNIQUE INDEX "IDX_${tablePrefix}943d8f922be094eb507cb9a7f9" ON "${tablePrefix}workflow_entity" ("name") `, ); diff --git a/packages/cli/src/databases/migrations/sqlite/1648740597343-LowerCaseUserEmail.ts b/packages/cli/src/databases/migrations/sqlite/1648740597343-LowerCaseUserEmail.ts index 95c81401f2832..2f2ee528f1e0a 100644 --- a/packages/cli/src/databases/migrations/sqlite/1648740597343-LowerCaseUserEmail.ts +++ b/packages/cli/src/databases/migrations/sqlite/1648740597343-LowerCaseUserEmail.ts @@ -1,22 +1,10 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class LowerCaseUserEmail1648740597343 implements MigrationInterface { - name = 'LowerCaseUserEmail1648740597343'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +export class LowerCaseUserEmail1648740597343 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` UPDATE "${tablePrefix}user" SET email = LOWER(email); `); - - logMigrationEnd(this.name); } - - public async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/sqlite/1652254514001-CommunityNodes.ts b/packages/cli/src/databases/migrations/sqlite/1652254514001-CommunityNodes.ts index 89d31f30f7170..fc79d63e0dc10 100644 --- a/packages/cli/src/databases/migrations/sqlite/1652254514001-CommunityNodes.ts +++ b/packages/cli/src/databases/migrations/sqlite/1652254514001-CommunityNodes.ts @@ -1,42 +1,32 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CommunityNodes1652254514001 implements MigrationInterface { - name = 'CommunityNodes1652254514001'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.get('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CommunityNodes1652254514001 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE "${tablePrefix}installed_packages" (` + - `"packageName" char(214) NOT NULL,` + - `"installedVersion" char(50) NOT NULL,` + - `"authorName" char(70) NULL,` + - `"authorEmail" char(70) NULL,` + - `"createdAt" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')',` + - `"updatedAt" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')',` + - `PRIMARY KEY("packageName")` + - `);`, + '"packageName" char(214) NOT NULL,' + + '"installedVersion" char(50) NOT NULL,' + + '"authorName" char(70) NULL,' + + '"authorEmail" char(70) NULL,' + + "\"createdAt\" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')'," + + "\"updatedAt\" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')'," + + 'PRIMARY KEY("packageName")' + + ');', ); await queryRunner.query( `CREATE TABLE "${tablePrefix}installed_nodes" (` + - `"name" char(200) NOT NULL,` + - `"type" char(200) NOT NULL,` + - `"latestVersion" INTEGER DEFAULT 1,` + - `"package" char(214) NOT NULL,` + - `PRIMARY KEY("name"),` + + '"name" char(200) NOT NULL,' + + '"type" char(200) NOT NULL,' + + '"latestVersion" INTEGER DEFAULT 1,' + + '"package" char(214) NOT NULL,' + + 'PRIMARY KEY("name"),' + `FOREIGN KEY("package") REFERENCES "${tablePrefix}installed_packages"("packageName") ON DELETE CASCADE ON UPDATE CASCADE` + - `);`, + ');', ); - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.get('database.tablePrefix'); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}installed_nodes"`); await queryRunner.query(`DROP TABLE "${tablePrefix}installed_packages"`); } diff --git a/packages/cli/src/databases/migrations/sqlite/1652367743993-AddUserSettings.ts b/packages/cli/src/databases/migrations/sqlite/1652367743993-AddUserSettings.ts index 111e3545bc1b4..fa587520e651f 100644 --- a/packages/cli/src/databases/migrations/sqlite/1652367743993-AddUserSettings.ts +++ b/packages/cli/src/databases/migrations/sqlite/1652367743993-AddUserSettings.ts @@ -1,17 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class AddUserSettings1652367743993 implements MigrationInterface { - name = 'AddUserSettings1652367743993'; - - transaction = false; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +export class AddUserSettings1652367743993 implements ReversibleMigration { + transaction = false as const; + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query('PRAGMA foreign_keys=OFF'); await queryRunner.query( @@ -28,13 +20,9 @@ export class AddUserSettings1652367743993 implements MigrationInterface { ); await queryRunner.query('PRAGMA foreign_keys=ON'); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE "${tablePrefix}user" RENAME TO "temporary_user"`); await queryRunner.query( `CREATE TABLE "${tablePrefix}user" ("id" varchar PRIMARY KEY NOT NULL, "email" varchar(255), "firstName" varchar(32), "lastName" varchar(32), "password" varchar, "resetPasswordToken" varchar, "resetPasswordTokenExpiration" integer DEFAULT NULL, "personalizationAnswers" text, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "updatedAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "globalRoleId" integer NOT NULL, CONSTRAINT "FK_${tablePrefix}f0609be844f9200ff4365b1bb3d" FOREIGN KEY ("globalRoleId") REFERENCES "${tablePrefix}role" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION)`, @@ -42,7 +30,7 @@ export class AddUserSettings1652367743993 implements MigrationInterface { await queryRunner.query( `INSERT INTO "${tablePrefix}user"("id", "email", "firstName", "lastName", "password", "resetPasswordToken", "resetPasswordTokenExpiration", "personalizationAnswers", "createdAt", "updatedAt", "globalRoleId") SELECT "id", "email", "firstName", "lastName", "password", "resetPasswordToken", "resetPasswordTokenExpiration", "personalizationAnswers", "createdAt", "updatedAt", "globalRoleId" FROM "temporary_user"`, ); - await queryRunner.query(`DROP TABLE "temporary_user"`); + await queryRunner.query('DROP TABLE "temporary_user"'); await queryRunner.query( `CREATE UNIQUE INDEX "UQ_${tablePrefix}e12875dfb3b1d92d7d7c5377e2" ON "${tablePrefix}user" ("email")`, ); diff --git a/packages/cli/src/databases/migrations/sqlite/1652905585850-AddAPIKeyColumn.ts b/packages/cli/src/databases/migrations/sqlite/1652905585850-AddAPIKeyColumn.ts index 3ec1d85c98975..ea4c159ac85bf 100644 --- a/packages/cli/src/databases/migrations/sqlite/1652905585850-AddAPIKeyColumn.ts +++ b/packages/cli/src/databases/migrations/sqlite/1652905585850-AddAPIKeyColumn.ts @@ -1,17 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class AddAPIKeyColumn1652905585850 implements MigrationInterface { - name = 'AddAPIKeyColumn1652905585850'; - - transaction = false; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +export class AddAPIKeyColumn1652905585850 implements ReversibleMigration { + transaction = false as const; + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query('PRAGMA foreign_keys=OFF'); await queryRunner.query( @@ -31,13 +23,9 @@ export class AddAPIKeyColumn1652905585850 implements MigrationInterface { ); await queryRunner.query('PRAGMA foreign_keys=ON'); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE "${tablePrefix}user" RENAME TO "temporary_user"`); await queryRunner.query( `CREATE TABLE "${tablePrefix}user" ("id" varchar PRIMARY KEY NOT NULL, "email" varchar(255), "firstName" varchar(32), "lastName" varchar(32), "password" varchar, "resetPasswordToken" varchar, "resetPasswordTokenExpiration" integer DEFAULT NULL, "personalizationAnswers" text, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "updatedAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "globalRoleId" integer NOT NULL, "settings" text, CONSTRAINT "FK_${tablePrefix}f0609be844f9200ff4365b1bb3d" FOREIGN KEY ("globalRoleId") REFERENCES "${tablePrefix}role" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION)`, @@ -45,7 +33,7 @@ export class AddAPIKeyColumn1652905585850 implements MigrationInterface { await queryRunner.query( `INSERT INTO "${tablePrefix}user"("id", "email", "firstName", "lastName", "password", "resetPasswordToken", "resetPasswordTokenExpiration", "personalizationAnswers", "createdAt", "updatedAt", "globalRoleId", "settings") SELECT "id", "email", "firstName", "lastName", "password", "resetPasswordToken", "resetPasswordTokenExpiration", "personalizationAnswers", "createdAt", "updatedAt", "globalRoleId", "settings" FROM "temporary_user"`, ); - await queryRunner.query(`DROP TABLE "temporary_user"`); + await queryRunner.query('DROP TABLE "temporary_user"'); await queryRunner.query( `CREATE UNIQUE INDEX "UQ_${tablePrefix}e12875dfb3b1d92d7d7c5377e2" ON "${tablePrefix}user" ("email")`, ); diff --git a/packages/cli/src/databases/migrations/sqlite/1654089251344-IntroducePinData.ts b/packages/cli/src/databases/migrations/sqlite/1654089251344-IntroducePinData.ts index f951647216b03..cdf424aec2888 100644 --- a/packages/cli/src/databases/migrations/sqlite/1654089251344-IntroducePinData.ts +++ b/packages/cli/src/databases/migrations/sqlite/1654089251344-IntroducePinData.ts @@ -1,25 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class IntroducePinData1654089251344 implements MigrationInterface { - name = 'IntroducePinData1654089251344'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class IntroducePinData1654089251344 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` ADD COLUMN "pinData" text`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` RENAME TO "temporary_workflow_entity"`, ); @@ -30,6 +18,6 @@ export class IntroducePinData1654089251344 implements MigrationInterface { await queryRunner.query( `INSERT INTO \`${tablePrefix}workflow_entity\` ("id", "name", "active", "nodes", "connections", "createdAt", "updatedAt", "settings", "staticData") SELECT "id", "name", "active", "nodes", "connections", "createdAt", "updatedAt", "settings", "staticData" FROM "temporary_workflow_entity"`, ); - await queryRunner.query(`DROP TABLE "temporary_workflow_entity"`); + await queryRunner.query('DROP TABLE "temporary_workflow_entity"'); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1658930531669-AddNodeIds.ts b/packages/cli/src/databases/migrations/sqlite/1658930531669-AddNodeIds.ts index 47f5d5c759fc5..6fe635848aca3 100644 --- a/packages/cli/src/databases/migrations/sqlite/1658930531669-AddNodeIds.ts +++ b/packages/cli/src/databases/migrations/sqlite/1658930531669-AddNodeIds.ts @@ -1,20 +1,18 @@ -import { INode } from 'n8n-workflow'; -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +/* eslint-disable @typescript-eslint/no-unsafe-argument */ +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable n8n-local-rules/no-uncaught-json-parse */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import type { INode } from 'n8n-workflow'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { runInBatches } from '@db/utils/migrationHelpers'; import { v4 as uuid } from 'uuid'; // add node ids in workflow objects -export class AddNodeIds1658930531669 implements MigrationInterface { - name = 'AddNodeIds1658930531669'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); - +export class AddNodeIds1658930531669 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { const workflowsQuery = ` SELECT id, nodes FROM "${tablePrefix}workflow_entity" @@ -40,16 +38,12 @@ export class AddNodeIds1658930531669 implements MigrationInterface { {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); }); }); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { const workflowsQuery = ` SELECT id, nodes FROM "${tablePrefix}workflow_entity" @@ -72,7 +66,7 @@ export class AddNodeIds1658930531669 implements MigrationInterface { {}, ); - queryRunner.query(updateQuery, updateParams); + await queryRunner.query(updateQuery, updateParams); }); }); } diff --git a/packages/cli/src/databases/migrations/sqlite/1659888469333-AddJsonKeyPinData.ts b/packages/cli/src/databases/migrations/sqlite/1659888469333-AddJsonKeyPinData.ts index f2ce0f0badd0a..af53836aebf75 100644 --- a/packages/cli/src/databases/migrations/sqlite/1659888469333-AddJsonKeyPinData.ts +++ b/packages/cli/src/databases/migrations/sqlite/1659888469333-AddJsonKeyPinData.ts @@ -1,24 +1,17 @@ -import { - logMigrationStart, - logMigrationEnd, - runInBatches, - getTablePrefix, - escapeQuery, -} from '@db/utils/migrationHelpers'; -import type { MigrationInterface, QueryRunner } from 'typeorm'; -import { isJsonKeyObject, PinData } from '@db/utils/migrations.types'; +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/no-use-before-define */ +import type { IDataObject, INodeExecutionData } from 'n8n-workflow'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +import { runInBatches, escapeQuery } from '@db/utils/migrationHelpers'; /** * Convert TEXT-type `pinData` column in `workflow_entity` table from * `{ [nodeName: string]: IDataObject[] }` to `{ [nodeName: string]: INodeExecutionData[] }` */ -export class AddJsonKeyPinData1659888469333 implements MigrationInterface { - name = 'AddJsonKeyPinData1659888469333'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - - const workflowTable = `${getTablePrefix()}workflow_entity`; +export class AddJsonKeyPinData1659888469333 implements IrreversibleMigration { + async up(context: MigrationContext) { + const { queryRunner, tablePrefix } = context; + const workflowTable = `${tablePrefix}workflow_entity`; const PINDATA_SELECT_QUERY = ` SELECT id, pinData @@ -35,30 +28,45 @@ export class AddJsonKeyPinData1659888469333 implements MigrationInterface { await runInBatches( queryRunner, PINDATA_SELECT_QUERY, - addJsonKeyToPinDataColumn(queryRunner, PINDATA_UPDATE_STATEMENT), + addJsonKeyToPinDataColumn(context, PINDATA_UPDATE_STATEMENT), ); - - logMigrationEnd(this.name); } +} - async down() { - // irreversible migration - } +namespace PinData { + export type Old = { [nodeName: string]: IDataObject[] }; + + export type New = { [nodeName: string]: INodeExecutionData[] }; + + export type FetchedWorkflow = { id: number; pinData: string | Old }; } -export const addJsonKeyToPinDataColumn = - (queryRunner: QueryRunner, updateStatement: string) => - async (fetchedWorkflows: PinData.FetchedWorkflow[]) => { - makeUpdateParams(fetchedWorkflows).forEach((param) => { - const params = { - pinData: param.pinData, - id: param.id, - }; +function isObjectLiteral(maybeObject: unknown): maybeObject is { [key: string]: string } { + return typeof maybeObject === 'object' && maybeObject !== null && !Array.isArray(maybeObject); +} - const [escapedStatement, escapedParams] = escapeQuery(queryRunner, updateStatement, params); +function isJsonKeyObject(item: unknown): item is { + json: unknown; + [keys: string]: unknown; +} { + if (!isObjectLiteral(item)) return false; + return Object.keys(item).includes('json'); +} - queryRunner.query(escapedStatement, escapedParams); - }); +export const addJsonKeyToPinDataColumn = + ({ queryRunner }: MigrationContext, updateStatement: string) => + async (fetchedWorkflows: PinData.FetchedWorkflow[]) => { + await Promise.all( + makeUpdateParams(fetchedWorkflows).map(async (param) => { + const params = { + pinData: param.pinData, + id: param.id, + }; + + const [escapedStatement, escapedParams] = escapeQuery(queryRunner, updateStatement, params); + return queryRunner.query(escapedStatement, escapedParams); + }), + ); }; function makeUpdateParams(fetchedWorkflows: PinData.FetchedWorkflow[]) { @@ -77,6 +85,7 @@ function makeUpdateParams(fetchedWorkflows: PinData.FetchedWorkflow[]) { } const newPinDataPerWorkflow = Object.keys(pinDataPerWorkflow).reduce( + // eslint-disable-next-line @typescript-eslint/no-shadow (newPinDataPerWorkflow, nodeName) => { let pinDataPerNode = pinDataPerWorkflow[nodeName]; diff --git a/packages/cli/src/databases/migrations/sqlite/1660062385367-CreateCredentialsUserRole.ts b/packages/cli/src/databases/migrations/sqlite/1660062385367-CreateCredentialsUserRole.ts index 2d2f4c5a08141..f3481a387696b 100644 --- a/packages/cli/src/databases/migrations/sqlite/1660062385367-CreateCredentialsUserRole.ts +++ b/packages/cli/src/databases/migrations/sqlite/1660062385367-CreateCredentialsUserRole.ts @@ -1,27 +1,15 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import config from '@/config'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateCredentialsUserRole1660062385367 implements MigrationInterface { - name = 'CreateCredentialsUserRole1660062385367'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateCredentialsUserRole1660062385367 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` INSERT INTO "${tablePrefix}role" (name, scope) VALUES ("user", "credential") ON CONFLICT DO NOTHING; `); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` DELETE FROM "${tablePrefix}role" WHERE name='user' AND scope='credential'; `); diff --git a/packages/cli/src/databases/migrations/sqlite/1663755770892-CreateWorkflowsUserRole.ts b/packages/cli/src/databases/migrations/sqlite/1663755770892-CreateWorkflowsUserRole.ts index 2bcf993c8e17a..3f590a20b056e 100644 --- a/packages/cli/src/databases/migrations/sqlite/1663755770892-CreateWorkflowsUserRole.ts +++ b/packages/cli/src/databases/migrations/sqlite/1663755770892-CreateWorkflowsUserRole.ts @@ -1,26 +1,15 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateWorkflowsEditorRole1663755770892 implements MigrationInterface { - name = 'CreateWorkflowsEditorRole1663755770892'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateWorkflowsEditorRole1663755770892 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` INSERT INTO "${tablePrefix}role" (name, scope) VALUES ("editor", "workflow") ON CONFLICT DO NOTHING; `); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` DELETE FROM "${tablePrefix}role" WHERE name='user' AND scope='workflow'; `); diff --git a/packages/cli/src/databases/migrations/sqlite/1664196174000-WorkflowStatistics.ts b/packages/cli/src/databases/migrations/sqlite/1664196174000-WorkflowStatistics.ts index f400350ccd4e4..842af220f8dbb 100644 --- a/packages/cli/src/databases/migrations/sqlite/1664196174000-WorkflowStatistics.ts +++ b/packages/cli/src/databases/migrations/sqlite/1664196174000-WorkflowStatistics.ts @@ -1,15 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '../../utils/migrationHelpers'; -import config from '@/config'; - -export class WorkflowStatistics1664196174000 implements MigrationInterface { - name = 'WorkflowStatistics1664196174000'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class WorkflowStatistics1664196174000 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE \`${tablePrefix}workflow_statistics\` ( "count" INTEGER DEFAULT 0, @@ -25,13 +17,9 @@ export class WorkflowStatistics1664196174000 implements MigrationInterface { await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` ADD COLUMN "dataLoaded" BOOLEAN DEFAULT false`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}workflow_statistics"`); await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` DROP COLUMN "dataLoaded"`, diff --git a/packages/cli/src/databases/migrations/sqlite/1665484192211-CreateCredentialUsageTable.ts b/packages/cli/src/databases/migrations/sqlite/1665484192211-CreateCredentialUsageTable.ts index adda3742e97bd..3bc30e5c4d8e2 100644 --- a/packages/cli/src/databases/migrations/sqlite/1665484192211-CreateCredentialUsageTable.ts +++ b/packages/cli/src/databases/migrations/sqlite/1665484192211-CreateCredentialUsageTable.ts @@ -1,33 +1,22 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateCredentialUsageTable1665484192211 implements MigrationInterface { - name = 'CreateCredentialUsageTable1665484192211'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateCredentialUsageTable1665484192211 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE "${tablePrefix}credential_usage" (` + - `"workflowId" integer NOT NULL,` + - `"nodeId" varchar NOT NULL,` + - `"credentialId" integer NOT NULL,` + - `"createdAt" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')',` + - `"updatedAt" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')',` + - `PRIMARY KEY("workflowId", "nodeId", "credentialId"), ` + + '"workflowId" integer NOT NULL,' + + '"nodeId" varchar NOT NULL,' + + '"credentialId" integer NOT NULL,' + + "\"createdAt\" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')'," + + "\"updatedAt\" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')'," + + 'PRIMARY KEY("workflowId", "nodeId", "credentialId"), ' + `CONSTRAINT "FK_${tablePrefix}518e1ece107b859ca6ce9ed2487f7e23" FOREIGN KEY ("workflowId") REFERENCES "${tablePrefix}workflow_entity" ("id") ON DELETE CASCADE ON UPDATE NO ACTION, ` + `CONSTRAINT "FK_${tablePrefix}7ce200a20ade7ae89fa7901da896993f" FOREIGN KEY ("credentialId") REFERENCES "${tablePrefix}credentials_entity" ("id") ON DELETE CASCADE ON UPDATE NO ACTION ` + - `);`, + ');', ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}credential_usage"`); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1665754637024-RemoveCredentialUsageTable.ts b/packages/cli/src/databases/migrations/sqlite/1665754637024-RemoveCredentialUsageTable.ts index b92ee11ef7767..54be01f00afe3 100644 --- a/packages/cli/src/databases/migrations/sqlite/1665754637024-RemoveCredentialUsageTable.ts +++ b/packages/cli/src/databases/migrations/sqlite/1665754637024-RemoveCredentialUsageTable.ts @@ -1,30 +1,22 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class RemoveCredentialUsageTable1665754637024 implements MigrationInterface { - name = 'RemoveCredentialUsageTable1665754637024'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +export class RemoveCredentialUsageTable1665754637024 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}credential_usage"`); - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE "${tablePrefix}credential_usage" (` + - `"workflowId" integer NOT NULL,` + - `"nodeId" varchar NOT NULL,` + - `"credentialId" integer NOT NULL,` + - `"createdAt" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')',` + - `"updatedAt" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')',` + - `PRIMARY KEY("workflowId", "nodeId", "credentialId"), ` + + '"workflowId" integer NOT NULL,' + + '"nodeId" varchar NOT NULL,' + + '"credentialId" integer NOT NULL,' + + "\"createdAt\" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')'," + + "\"updatedAt\" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')'," + + 'PRIMARY KEY("workflowId", "nodeId", "credentialId"), ' + `CONSTRAINT "FK_${tablePrefix}518e1ece107b859ca6ce9ed2487f7e23" FOREIGN KEY ("workflowId") REFERENCES "${tablePrefix}workflow_entity" ("id") ON DELETE CASCADE ON UPDATE NO ACTION, ` + `CONSTRAINT "FK_${tablePrefix}7ce200a20ade7ae89fa7901da896993f" FOREIGN KEY ("credentialId") REFERENCES "${tablePrefix}credentials_entity" ("id") ON DELETE CASCADE ON UPDATE NO ACTION ` + - `);`, + ');', ); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1669739707124-AddWorkflowVersionIdColumn.ts b/packages/cli/src/databases/migrations/sqlite/1669739707124-AddWorkflowVersionIdColumn.ts index 17483e8b9841f..14a21bf29d44d 100644 --- a/packages/cli/src/databases/migrations/sqlite/1669739707124-AddWorkflowVersionIdColumn.ts +++ b/packages/cli/src/databases/migrations/sqlite/1669739707124-AddWorkflowVersionIdColumn.ts @@ -1,45 +1,31 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { v4 as uuidv4 } from 'uuid'; -export class AddWorkflowVersionIdColumn1669739707124 implements MigrationInterface { - name = 'AddWorkflowVersionIdColumn1669739707124'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); - +export class AddWorkflowVersionIdColumn1669739707124 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` ADD COLUMN "versionId" char(36)`, ); - const workflowIds: Array<{ id: number }> = await queryRunner.query(` + const workflowIds = (await queryRunner.query(` SELECT id FROM "${tablePrefix}workflow_entity" - `); + `)) as Array<{ id: number }>; - workflowIds.map(({ id }) => { + for (const { id } of workflowIds) { const [updateQuery, updateParams] = queryRunner.connection.driver.escapeQueryWithParameters( - ` - UPDATE "${tablePrefix}workflow_entity" - SET versionId = :versionId - WHERE id = '${id}' - `, + `UPDATE "${tablePrefix}workflow_entity" + SET versionId = :versionId + WHERE id = '${id}'`, { versionId: uuidv4() }, {}, ); - return queryRunner.query(updateQuery, updateParams); - }); - - logMigrationEnd(this.name); + await queryRunner.query(updateQuery, updateParams); + } } - async down(queryRunner: QueryRunner) { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` DROP COLUMN "versionId"`, ); diff --git a/packages/cli/src/databases/migrations/sqlite/1669823906993-AddTriggerCountColumn.ts b/packages/cli/src/databases/migrations/sqlite/1669823906993-AddTriggerCountColumn.ts index b5727e9b0107b..d2a028587c663 100644 --- a/packages/cli/src/databases/migrations/sqlite/1669823906993-AddTriggerCountColumn.ts +++ b/packages/cli/src/databases/migrations/sqlite/1669823906993-AddTriggerCountColumn.ts @@ -1,26 +1,14 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class AddTriggerCountColumn1669823906993 implements MigrationInterface { - name = 'AddTriggerCountColumn1669823906993'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddTriggerCountColumn1669823906993 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` ADD COLUMN "triggerCount" integer NOT NULL DEFAULT 0`, ); // Table will be populated by n8n startup - see ActiveWorkflowRunner.ts - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` DROP COLUMN "triggerCount"`, ); diff --git a/packages/cli/src/databases/migrations/sqlite/1671535397530-MessageEventBusDestinations.ts b/packages/cli/src/databases/migrations/sqlite/1671535397530-MessageEventBusDestinations.ts index 84536e3f1143b..92a67e4e414c5 100644 --- a/packages/cli/src/databases/migrations/sqlite/1671535397530-MessageEventBusDestinations.ts +++ b/packages/cli/src/databases/migrations/sqlite/1671535397530-MessageEventBusDestinations.ts @@ -1,27 +1,18 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '../../utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class MessageEventBusDestinations1671535397530 implements MigrationInterface { - name = 'MessageEventBusDestinations1671535397530'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +export class MessageEventBusDestinations1671535397530 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE "${tablePrefix}event_destinations" (` + - `"id" varchar(36) PRIMARY KEY NOT NULL,` + - `"destination" text NOT NULL,` + - `"createdAt" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')',` + - `"updatedAt" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')'` + - `);`, + '"id" varchar(36) PRIMARY KEY NOT NULL,' + + '"destination" text NOT NULL,' + + "\"createdAt\" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')'," + + "\"updatedAt\" datetime(3) NOT NULL DEFAULT 'STRFTIME(''%Y-%m-%d %H:%M:%f'', ''NOW'')'" + + ');', ); - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}event_destinations"`); - logMigrationEnd(this.name); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1671726148419-RemoveWorkflowDataLoadedFlag.ts b/packages/cli/src/databases/migrations/sqlite/1671726148419-RemoveWorkflowDataLoadedFlag.ts index 36ac917b60575..31b1f95481158 100644 --- a/packages/cli/src/databases/migrations/sqlite/1671726148419-RemoveWorkflowDataLoadedFlag.ts +++ b/packages/cli/src/databases/migrations/sqlite/1671726148419-RemoveWorkflowDataLoadedFlag.ts @@ -1,23 +1,15 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; -import { v4 as uuidv4 } from 'uuid'; -import { StatisticsNames } from '@db/entities/WorkflowStatistics'; - -export class RemoveWorkflowDataLoadedFlag1671726148419 implements MigrationInterface { - name = 'RemoveWorkflowDataLoadedFlag1671726148419'; - - async up(queryRunner: QueryRunner) { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +import { StatisticsNames } from '@/databases/entities/WorkflowStatistics'; +export class RemoveWorkflowDataLoadedFlag1671726148419 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { // If any existing workflow has dataLoaded set to true, insert the relevant information to the statistics table - const workflowIds: Array<{ id: number; dataLoaded: boolean }> = await queryRunner.query(` + const workflowIds = (await queryRunner.query(` SELECT id, dataLoaded FROM "${tablePrefix}workflow_entity" - `); + `)) as Array<{ id: number; dataLoaded: boolean }>; - workflowIds.map(({ id, dataLoaded }) => { + workflowIds.map(async ({ id, dataLoaded }) => { if (dataLoaded) { const [insertQuery, insertParams] = queryRunner.connection.driver.escapeQueryWithParameters( ` @@ -36,24 +28,20 @@ export class RemoveWorkflowDataLoadedFlag1671726148419 implements MigrationInter await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` DROP COLUMN "dataLoaded"`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner) { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}workflow_entity\` ADD COLUMN "dataLoaded" BOOLEAN DEFAULT false`, ); // Search through statistics for any workflows that have the dataLoaded stat - const workflowsIds: Array<{ workflowId: string }> = await queryRunner.query(` + const workflowsIds = (await queryRunner.query(` SELECT workflowId FROM "${tablePrefix}workflow_statistics" WHERE name = '${StatisticsNames.dataLoaded}' - `); - workflowsIds.map(({ workflowId }) => { + `)) as Array<{ workflowId: string }>; + workflowsIds.map(async ({ workflowId }) => { return queryRunner.query(` UPDATE "${tablePrefix}workflow_entity" SET dataLoaded = true diff --git a/packages/cli/src/databases/migrations/sqlite/1673268682475-DeleteExecutionsWithWorkflows.ts b/packages/cli/src/databases/migrations/sqlite/1673268682475-DeleteExecutionsWithWorkflows.ts index d9f0fd2d6c737..0b1e8f7b0eb44 100644 --- a/packages/cli/src/databases/migrations/sqlite/1673268682475-DeleteExecutionsWithWorkflows.ts +++ b/packages/cli/src/databases/migrations/sqlite/1673268682475-DeleteExecutionsWithWorkflows.ts @@ -1,18 +1,12 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; -export class DeleteExecutionsWithWorkflows1673268682475 implements MigrationInterface { - name = 'DeleteExecutionsWithWorkflows1673268682475'; +export class DeleteExecutionsWithWorkflows1673268682475 implements ReversibleMigration { + transaction = false as const; - transaction = false; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); - - const workflowIds: Array<{ id: number }> = await queryRunner.query(` + async up({ queryRunner, tablePrefix }: MigrationContext) { + const workflowIds = (await queryRunner.query(` SELECT id FROM "${tablePrefix}workflow_entity" - `); + `)) as Array<{ id: number }>; await queryRunner.query( `DELETE FROM "${tablePrefix}execution_entity" @@ -61,13 +55,9 @@ export class DeleteExecutionsWithWorkflows1673268682475 implements MigrationInte ); await queryRunner.query('PRAGMA foreign_keys=ON'); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE IF EXISTS "${tablePrefix}temporary_execution_entity"`); await queryRunner.query( `CREATE TABLE "${tablePrefix}temporary_execution_entity" ( diff --git a/packages/cli/src/databases/migrations/sqlite/1674138566000-AddStatusToExecutions.ts b/packages/cli/src/databases/migrations/sqlite/1674138566000-AddStatusToExecutions.ts index b77a57f45e349..8633fe8e004d7 100644 --- a/packages/cli/src/databases/migrations/sqlite/1674138566000-AddStatusToExecutions.ts +++ b/packages/cli/src/databases/migrations/sqlite/1674138566000-AddStatusToExecutions.ts @@ -1,23 +1,13 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class AddStatusToExecutions1674138566000 implements MigrationInterface { - name = 'AddStatusToExecutions1674138566000'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class AddStatusToExecutions1674138566000 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE \`${tablePrefix}execution_entity\` ADD COLUMN "status" varchar`, ); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.getEnv('database.tablePrefix'); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`ALTER TABLE \`${tablePrefix}execution_entity\` DROP COLUMN "status"`); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1674509946020-CreateLdapEntities.ts b/packages/cli/src/databases/migrations/sqlite/1674509946020-CreateLdapEntities.ts index ce885221749e8..aec0427ae469a 100644 --- a/packages/cli/src/databases/migrations/sqlite/1674509946020-CreateLdapEntities.ts +++ b/packages/cli/src/databases/migrations/sqlite/1674509946020-CreateLdapEntities.ts @@ -1,14 +1,8 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/Ldap/constants'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -export class CreateLdapEntities1674509946020 implements MigrationInterface { - name = 'CreateLdapEntities1674509946020'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); +export class CreateLdapEntities1674509946020 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `ALTER TABLE ${tablePrefix}user ADD COLUMN disabled BOOLEAN NOT NULL DEFAULT false;`, ); @@ -44,12 +38,9 @@ export class CreateLdapEntities1674509946020 implements MigrationInterface { "error" TEXT );`, ); - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}auth_provider_sync_history"`); await queryRunner.query(`DROP TABLE "${tablePrefix}auth_identity"`); diff --git a/packages/cli/src/databases/migrations/sqlite/1675940580449-PurgeInvalidWorkflowConnections.ts b/packages/cli/src/databases/migrations/sqlite/1675940580449-PurgeInvalidWorkflowConnections.ts index 8207f2c8f3f2d..5cc64ca7c86d5 100644 --- a/packages/cli/src/databases/migrations/sqlite/1675940580449-PurgeInvalidWorkflowConnections.ts +++ b/packages/cli/src/databases/migrations/sqlite/1675940580449-PurgeInvalidWorkflowConnections.ts @@ -1,29 +1,21 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { IConnections, INode } from 'n8n-workflow'; +import { jsonParse } from 'n8n-workflow'; +import type { MigrationContext, IrreversibleMigration } from '@db/types'; import { NodeTypes } from '@/NodeTypes'; -import { IConnections, INode } from 'n8n-workflow'; -import { getLogger } from '@/Logger'; import { Container } from 'typedi'; -export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationInterface { - name = 'PurgeInvalidWorkflowConnections1675940580449'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); - - const workflows: Array<{ id: number; nodes: string; connections: string }> = - await queryRunner.query(` +export class PurgeInvalidWorkflowConnections1675940580449 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix, migrationName, logger }: MigrationContext) { + const workflows = (await queryRunner.query(` SELECT id, nodes, connections FROM "${tablePrefix}workflow_entity" - `); + `)) as Array<{ id: number; nodes: string; connections: string }>; const nodeTypes = Container.get(NodeTypes); workflows.forEach(async (workflow) => { - let connections: IConnections = JSON.parse(workflow.connections); - const nodes: INode[] = JSON.parse(workflow.nodes); + const connections = jsonParse(workflow.connections); + const nodes = jsonParse(workflow.nodes); const nodesThatCannotReceiveInput: string[] = nodes.reduce((acc, node) => { try { @@ -32,7 +24,7 @@ export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationIn acc.push(node.name); } } catch (error) { - getLogger().warn(`Migration ${this.name} failed with error: ${error.message}`); + logger.warn(`Migration ${migrationName} failed with error: ${(error as Error).message}`); } return acc; }, [] as string[]); @@ -41,7 +33,7 @@ export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationIn const connection = connections[sourceNodeName]; const outputs = Object.keys(connection); - outputs.forEach((outputConnectionName /* Like `main` */, idx) => { + outputs.forEach((outputConnectionName /* Like `main` */) => { const outputConnection = connection[outputConnectionName]; // It filters out all connections that are connected to a node that cannot receive input @@ -67,11 +59,5 @@ export class PurgeInvalidWorkflowConnections1675940580449 implements MigrationIn await queryRunner.query(updateQuery, updateParams); }); - - logMigrationEnd(this.name); - } - - async down(queryRunner: QueryRunner): Promise { - // No need to revert this migration } } diff --git a/packages/cli/src/databases/migrations/sqlite/1676996103000-MigrateExecutionStatus.ts b/packages/cli/src/databases/migrations/sqlite/1676996103000-MigrateExecutionStatus.ts index 78334751ed7fa..71de0e434820d 100644 --- a/packages/cli/src/databases/migrations/sqlite/1676996103000-MigrateExecutionStatus.ts +++ b/packages/cli/src/databases/migrations/sqlite/1676996103000-MigrateExecutionStatus.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class MigrateExecutionStatus1676996103000 implements MigrationInterface { - name = 'MigrateExecutionStatus1676996103000'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +export class MigrateExecutionStatus1676996103000 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `UPDATE "${tablePrefix}execution_entity" SET "status" = 'waiting' WHERE "status" IS NULL AND "waitTill" IS NOT NULL;`, ); @@ -20,9 +14,5 @@ export class MigrateExecutionStatus1676996103000 implements MigrationInterface { await queryRunner.query( `UPDATE "${tablePrefix}execution_entity" SET "status" = 'crashed' WHERE "status" IS NULL;`, ); - - logMigrationEnd(this.name); } - - public async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/sqlite/1677237073720-UpdateRunningExecutionStatus.ts b/packages/cli/src/databases/migrations/sqlite/1677237073720-UpdateRunningExecutionStatus.ts index 335fd27c1f376..0fe69a57ff90c 100644 --- a/packages/cli/src/databases/migrations/sqlite/1677237073720-UpdateRunningExecutionStatus.ts +++ b/packages/cli/src/databases/migrations/sqlite/1677237073720-UpdateRunningExecutionStatus.ts @@ -1,22 +1,12 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class UpdateRunningExecutionStatus1677237073720 implements MigrationInterface { - name = 'UpdateRunningExecutionStatus1677237073720'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = config.getEnv('database.tablePrefix'); +import type { MigrationContext, IrreversibleMigration } from '@db/types'; +export class UpdateRunningExecutionStatus1677237073720 implements IrreversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `UPDATE "${tablePrefix}execution_entity" SET "status" = 'failed' WHERE "status" = 'running' AND "finished"=0 AND "stoppedAt" IS NOT NULL;`, ); await queryRunner.query( `UPDATE "${tablePrefix}execution_entity" SET "status" = 'success' WHERE "status" = 'running' AND "finished"=1 AND "stoppedAt" IS NOT NULL;`, ); - - logMigrationEnd(this.name); } - - public async down(queryRunner: QueryRunner): Promise {} } diff --git a/packages/cli/src/databases/migrations/sqlite/1677501636752-CreateVariables.ts b/packages/cli/src/databases/migrations/sqlite/1677501636752-CreateVariables.ts index da6265defa9e1..adc7d2ead4f54 100644 --- a/packages/cli/src/databases/migrations/sqlite/1677501636752-CreateVariables.ts +++ b/packages/cli/src/databases/migrations/sqlite/1677501636752-CreateVariables.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { logMigrationEnd, logMigrationStart, getTablePrefix } from '@db/utils/migrationHelpers'; -import config from '@/config'; - -export class CreateVariables1677501636752 implements MigrationInterface { - name = 'CreateVariables1677501636752'; - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateVariables1677501636752 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(` CREATE TABLE ${tablePrefix}variables ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, @@ -17,16 +11,9 @@ export class CreateVariables1677501636752 implements MigrationInterface { UNIQUE("key") ); `); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE ${tablePrefix}variables;`); - - logMigrationEnd(this.name); } } diff --git a/packages/cli/src/databases/migrations/sqlite/1679416281777-CreateExecutionMetadataTable.ts b/packages/cli/src/databases/migrations/sqlite/1679416281777-CreateExecutionMetadataTable.ts index 39c39ff522662..e521c8494f36c 100644 --- a/packages/cli/src/databases/migrations/sqlite/1679416281777-CreateExecutionMetadataTable.ts +++ b/packages/cli/src/databases/migrations/sqlite/1679416281777-CreateExecutionMetadataTable.ts @@ -1,13 +1,7 @@ -import { MigrationInterface, QueryRunner, Table } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; - -export class CreateExecutionMetadataTable1679416281777 implements MigrationInterface { - name = 'CreateExecutionMetadataTable1679416281777'; - - public async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - const tablePrefix = getTablePrefix(); +import type { MigrationContext, ReversibleMigration } from '@db/types'; +export class CreateExecutionMetadataTable1679416281777 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `CREATE TABLE "${tablePrefix}execution_metadata" ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, @@ -41,13 +35,9 @@ export class CreateExecutionMetadataTable1679416281777 implements MigrationInter await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2'`); // Remove index for stoppedAt since it's not used anymore await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}cefb067df2402f6aed0638a6c1'`); - - logMigrationEnd(this.name); } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); - + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query(`DROP TABLE "${tablePrefix}execution_metadata"`); await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}b94b45ce2c73ce46c54f20b5f9'`); await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}81fc04c8a17de15835713505e4'`); diff --git a/packages/cli/src/databases/migrations/sqlite/1681134145996-AddUserActivatedProperty.ts b/packages/cli/src/databases/migrations/sqlite/1681134145996-AddUserActivatedProperty.ts index 335c4b29a8e0f..3648a55cd5e5f 100644 --- a/packages/cli/src/databases/migrations/sqlite/1681134145996-AddUserActivatedProperty.ts +++ b/packages/cli/src/databases/migrations/sqlite/1681134145996-AddUserActivatedProperty.ts @@ -1,16 +1,9 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; -import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers'; +import type { MigrationContext, ReversibleMigration } from '@db/types'; import type { UserSettings } from '@/Interfaces'; -export class AddUserActivatedProperty1681134145996 implements MigrationInterface { - name = 'AddUserActivatedProperty1681134145996'; - - async up(queryRunner: QueryRunner): Promise { - logMigrationStart(this.name); - - const tablePrefix = getTablePrefix(); - - const activatedUsers: UserSettings[] = await queryRunner.query( +export class AddUserActivatedProperty1681134145996 implements ReversibleMigration { + async up({ queryRunner, tablePrefix }: MigrationContext) { + const activatedUsers = (await queryRunner.query( `SELECT DISTINCT sw.userId AS id, JSON_SET(COALESCE(u.settings, '{}'), '$.userActivated', JSON('true')) AS settings FROM ${tablePrefix}workflow_statistics AS ws @@ -23,10 +16,11 @@ export class AddUserActivatedProperty1681134145996 implements MigrationInterface WHERE ws.name = 'production_success' AND r.name = 'owner' AND r.scope = "workflow"`, - ); + )) as UserSettings[]; - const updatedUsers = activatedUsers.map((user) => + const updatedUsers = activatedUsers.map(async (user) => queryRunner.query( + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions `UPDATE ${tablePrefix}user SET settings = '${user.settings}' WHERE id = '${user.id}' `, ), ); @@ -43,12 +37,9 @@ export class AddUserActivatedProperty1681134145996 implements MigrationInterface `UPDATE ${tablePrefix}user SET settings = JSON_SET(COALESCE(settings, '{}'), '$.userActivated', JSON('false')) WHERE id NOT IN (${activatedUserIds})`, ); } - - logMigrationEnd(this.name); } - async down(queryRunner: QueryRunner): Promise { - const tablePrefix = getTablePrefix(); + async down({ queryRunner, tablePrefix }: MigrationContext) { await queryRunner.query( `UPDATE ${tablePrefix}user SET settings = JSON_REMOVE(settings, '$.userActivated')`, ); diff --git a/packages/cli/src/databases/migrations/sqlite/index.ts b/packages/cli/src/databases/migrations/sqlite/index.ts index e78aad2bc69ac..57f57ba1dc445 100644 --- a/packages/cli/src/databases/migrations/sqlite/index.ts +++ b/packages/cli/src/databases/migrations/sqlite/index.ts @@ -1,3 +1,4 @@ +import type { Migration } from '@db/types'; import { InitialMigration1588102412422 } from './1588102412422-InitialMigration'; import { WebhookModel1592445003908 } from './1592445003908-WebhookModel'; import { CreateIndexStoppedAt1594825041918 } from './1594825041918-CreateIndexStoppedAt'; @@ -35,7 +36,7 @@ import { CreateExecutionMetadataTable1679416281777 } from './1679416281777-Creat import { CreateVariables1677501636752 } from './1677501636752-CreateVariables'; import { AddUserActivatedProperty1681134145996 } from './1681134145996-AddUserActivatedProperty'; -const sqliteMigrations = [ +const sqliteMigrations: Migration[] = [ InitialMigration1588102412422, WebhookModel1592445003908, CreateIndexStoppedAt1594825041918, diff --git a/packages/cli/src/databases/types.ts b/packages/cli/src/databases/types.ts new file mode 100644 index 0000000000000..32fb7b0d9c153 --- /dev/null +++ b/packages/cli/src/databases/types.ts @@ -0,0 +1,32 @@ +import type { Logger } from '@/Logger'; +import type { QueryRunner } from 'typeorm'; + +export type DatabaseType = 'mariadb' | 'postgresdb' | 'mysqldb' | 'sqlite'; + +export interface MigrationContext { + logger: Logger; + queryRunner: QueryRunner; + tablePrefix: string; + dbType: DatabaseType; + dbName: string; + migrationName: string; +} + +type MigrationFn = (ctx: MigrationContext) => Promise; + +export interface ReversibleMigration { + up: MigrationFn; + down: MigrationFn; + transaction?: false; +} + +export interface IrreversibleMigration { + up: MigrationFn; + down?: never; +} + +export interface Migration extends Function { + prototype: ReversibleMigration | IrreversibleMigration; +} + +export type InsertResult = Array<{ insertId: number }>; diff --git a/packages/cli/src/databases/utils/migrationHelpers.ts b/packages/cli/src/databases/utils/migrationHelpers.ts index 88bb8b0598069..21d731e39ae35 100644 --- a/packages/cli/src/databases/utils/migrationHelpers.ts +++ b/packages/cli/src/databases/utils/migrationHelpers.ts @@ -5,6 +5,9 @@ import type { QueryRunner } from 'typeorm/query-runner/QueryRunner'; import config from '@/config'; import { getLogger } from '@/Logger'; import { inTest } from '@/constants'; +import type { Migration } from '@db/types'; + +const logger = getLogger(); const PERSONALIZATION_SURVEY_FILENAME = 'personalizationSurvey.json'; @@ -42,10 +45,10 @@ export function logMigrationStart(migrationName: string, disableLogging = inTest if (disableLogging) return; if (!logFinishTimeout) { - getLogger().warn('Migrations in progress, please do NOT stop the process.'); + logger.warn('Migrations in progress, please do NOT stop the process.'); } - getLogger().debug(`Starting migration ${migrationName}`); + logger.debug(`Starting migration ${migrationName}`); clearTimeout(logFinishTimeout); } @@ -53,13 +56,33 @@ export function logMigrationStart(migrationName: string, disableLogging = inTest export function logMigrationEnd(migrationName: string, disableLogging = inTest): void { if (disableLogging) return; - getLogger().debug(`Finished migration ${migrationName}`); + logger.debug(`Finished migration ${migrationName}`); logFinishTimeout = setTimeout(() => { - getLogger().warn('Migrations finished.'); + logger.warn('Migrations finished.'); }, 100); } +export const wrapMigration = (migration: Migration) => { + const dbType = config.getEnv('database.type'); + const dbName = config.getEnv(`database.${dbType === 'mariadb' ? 'mysqldb' : dbType}.database`); + const tablePrefix = config.getEnv('database.tablePrefix'); + const migrationName = migration.name; + const context = { tablePrefix, dbType, dbName, migrationName }; + + const { up, down } = migration.prototype; + Object.assign(migration.prototype, { + up: async (queryRunner: QueryRunner) => { + logMigrationStart(migrationName); + await up.call(this, { queryRunner, ...context }); + logMigrationEnd(migrationName); + }, + down: async (queryRunner: QueryRunner) => { + await down?.call(this, { queryRunner, ...context }); + }, + }); +}; + function batchQuery(query: string, limit: number, offset = 0): string { return ` ${query} @@ -91,8 +114,6 @@ export async function runInBatches( } while (batchedQueryResults.length === limit); } -export const getTablePrefix = () => config.getEnv('database.tablePrefix'); - export const escapeQuery = ( queryRunner: QueryRunner, query: string, diff --git a/packages/cli/src/databases/utils/migrations.types.ts b/packages/cli/src/databases/utils/migrations.types.ts deleted file mode 100644 index bb3fbca85bb3e..0000000000000 --- a/packages/cli/src/databases/utils/migrations.types.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { IDataObject, INodeExecutionData } from 'n8n-workflow'; - -export namespace PinData { - export type Old = { [nodeName: string]: IDataObject[] }; - - export type New = { [nodeName: string]: INodeExecutionData[] }; - - export type FetchedWorkflow = { id: number; pinData: string | Old }; -} - -export function isObjectLiteral(maybeObject: unknown): maybeObject is { [key: string]: string } { - return typeof maybeObject === 'object' && maybeObject !== null && !Array.isArray(maybeObject); -} - -export function isJsonKeyObject(item: unknown): item is { - json: unknown; - [otherKeys: string]: unknown; -} { - if (!isObjectLiteral(item)) return false; - - return Object.keys(item).includes('json'); -} diff --git a/packages/cli/test/integration/shared/testDb.ts b/packages/cli/test/integration/shared/testDb.ts index f855aff86b2a7..5cc910367d6b9 100644 --- a/packages/cli/test/integration/shared/testDb.ts +++ b/packages/cli/test/integration/shared/testDb.ts @@ -25,23 +25,36 @@ import type { ICredentialsDb } from '@/Interfaces'; import { DB_INITIALIZATION_TIMEOUT } from './constants'; import { randomApiKey, randomEmail, randomName, randomString, randomValidPassword } from './random'; -import { getPostgresSchemaSection } from './utils'; import type { CollectionName, CredentialPayload, InstalledNodePayload, InstalledPackagePayload, + PostgresSchemaSection, } from './types'; export type TestDBType = 'postgres' | 'mysql'; +export const testDbPrefix = 'n8n_test_'; + +export function getPostgresSchemaSection( + schema = config.getSchema(), +): PostgresSchemaSection | null { + for (const [key, value] of Object.entries(schema)) { + if (key === 'postgresdb') { + return value._cvtProperties; + } + } + return null; +} + /** * Initialize one test DB per suite run, with bootstrap connection if needed. */ export async function init() { jest.setTimeout(DB_INITIALIZATION_TIMEOUT); const dbType = config.getEnv('database.type'); - const testDbName = `n8n_test_${randomString(6, 10)}_${Date.now()}`; + const testDbName = `${testDbPrefix}${randomString(6, 10)}_${Date.now()}`; if (dbType === 'sqlite') { // no bootstrap connection required diff --git a/packages/cli/test/integration/shared/utils.ts b/packages/cli/test/integration/shared/utils.ts index dbd9920a517ee..8ae489a250336 100644 --- a/packages/cli/test/integration/shared/utils.ts +++ b/packages/cli/test/integration/shared/utils.ts @@ -51,7 +51,6 @@ import type { EndpointGroup, InstalledNodePayload, InstalledPackagePayload, - PostgresSchemaSection, } from './types'; import { licenseController } from '@/license/license.controller'; import { registerController } from '@/decorators'; @@ -760,22 +759,6 @@ export const setInstanceOwnerSetUp = async (value: boolean) => { ); }; -// ---------------------------------- -// misc -// ---------------------------------- - -export function getPostgresSchemaSection( - schema = config.getSchema(), -): PostgresSchemaSection | null { - for (const [key, value] of Object.entries(schema)) { - if (key === 'postgresdb') { - return value._cvtProperties; - } - } - - return null; -} - // ---------------------------------- // community nodes // ---------------------------------- diff --git a/packages/cli/test/teardown.ts b/packages/cli/test/teardown.ts index 07136f2ddb496..339708d412bc1 100644 --- a/packages/cli/test/teardown.ts +++ b/packages/cli/test/teardown.ts @@ -1,7 +1,7 @@ import 'tsconfig-paths/register'; import { DataSource as Connection } from 'typeorm'; import config from '@/config'; -import { getBootstrapDBOptions } from './integration/shared/testDb'; +import { getBootstrapDBOptions, testDbPrefix } from './integration/shared/testDb'; export default async () => { const dbType = config.getEnv('database.type').replace(/db$/, ''); @@ -14,9 +14,7 @@ export default async () => { dbType === 'postgres' ? 'SELECT datname as "Database" FROM pg_database' : 'SHOW DATABASES'; const results: Array<{ Database: string }> = await connection.query(query); const databases = results - .filter( - ({ Database: dbName }) => dbName.startsWith(`${dbType}_`) && dbName.endsWith('_n8n_test'), - ) + .filter(({ Database: dbName }) => dbName.startsWith(testDbPrefix)) .map(({ Database: dbName }) => dbName); const promises = databases.map(async (dbName) => connection.query(`DROP DATABASE ${dbName};`)); diff --git a/packages/editor-ui/src/App.vue b/packages/editor-ui/src/App.vue index 2498681e81d66..3969c9fd678b1 100644 --- a/packages/editor-ui/src/App.vue +++ b/packages/editor-ui/src/App.vue @@ -38,16 +38,16 @@ import { userHelpers } from '@/mixins/userHelpers'; import { loadLanguage } from './plugins/i18n'; import useGlobalLinkActions from '@/composables/useGlobalLinkActions'; import { mapStores } from 'pinia'; -import { useUIStore } from './stores/ui'; -import { useSettingsStore } from './stores/settings'; -import { useUsersStore } from './stores/users'; -import { useRootStore } from './stores/n8nRootStore'; -import { useTemplatesStore } from './stores/templates'; -import { useNodeTypesStore } from './stores/nodeTypes'; +import { useUIStore } from './stores/ui.store'; +import { useSettingsStore } from './stores/settings.store'; +import { useUsersStore } from './stores/users.store'; +import { useRootStore } from './stores/n8nRoot.store'; +import { useTemplatesStore } from './stores/templates.store'; +import { useNodeTypesStore } from './stores/nodeTypes.store'; import { useHistoryHelper } from '@/composables/useHistoryHelper'; import { newVersions } from '@/mixins/newVersions'; import { useRoute } from 'vue-router/composables'; -import { useVersionControlStore } from '@/stores/versionControl'; +import { useVersionControlStore } from '@/stores/versionControl.store'; export default mixins(newVersions, showMessage, userHelpers).extend({ name: 'App', diff --git a/packages/editor-ui/src/components/AboutModal.vue b/packages/editor-ui/src/components/AboutModal.vue index 19b57c1fd0bb7..ffc192e81b5b5 100644 --- a/packages/editor-ui/src/components/AboutModal.vue +++ b/packages/editor-ui/src/components/AboutModal.vue @@ -58,8 +58,8 @@ import { defineComponent } from 'vue'; import Modal from './Modal.vue'; import { ABOUT_MODAL_KEY } from '../constants'; import { mapStores } from 'pinia'; -import { useSettingsStore } from '@/stores/settings'; -import { useRootStore } from '@/stores/n8nRootStore'; +import { useSettingsStore } from '@/stores/settings.store'; +import { useRootStore } from '@/stores/n8nRoot.store'; import { createEventBus } from '@/event-bus'; export default defineComponent({ diff --git a/packages/editor-ui/src/components/ActivationModal.vue b/packages/editor-ui/src/components/ActivationModal.vue index 5a72229d684c5..29ebffd9ad520 100644 --- a/packages/editor-ui/src/components/ActivationModal.vue +++ b/packages/editor-ui/src/components/ActivationModal.vue @@ -46,9 +46,9 @@ import { } from '../constants'; import { getActivatableTriggerNodes, getTriggerNodeServiceName } from '@/utils'; import { mapStores } from 'pinia'; -import { useUIStore } from '@/stores/ui'; -import { useWorkflowsStore } from '@/stores/workflows'; -import { useNodeTypesStore } from '@/stores/nodeTypes'; +import { useUIStore } from '@/stores/ui.store'; +import { useWorkflowsStore } from '@/stores/workflows.store'; +import { useNodeTypesStore } from '@/stores/nodeTypes.store'; import { createEventBus } from '@/event-bus'; export default defineComponent({ diff --git a/packages/editor-ui/src/components/BinaryDataDisplay.vue b/packages/editor-ui/src/components/BinaryDataDisplay.vue index 4129fbe5807b9..f0d1eb599ca6f 100644 --- a/packages/editor-ui/src/components/BinaryDataDisplay.vue +++ b/packages/editor-ui/src/components/BinaryDataDisplay.vue @@ -27,7 +27,7 @@ import { nodeHelpers } from '@/mixins/nodeHelpers'; import mixins from 'vue-typed-mixins'; import { mapStores } from 'pinia'; -import { useWorkflowsStore } from '@/stores/workflows'; +import { useWorkflowsStore } from '@/stores/workflows.store'; export default mixins(nodeHelpers).extend({ name: 'BinaryDataDisplay', diff --git a/packages/editor-ui/src/components/CanvasControls.vue b/packages/editor-ui/src/components/CanvasControls.vue index e8fe2c409e082..0c79d90d5d94f 100644 --- a/packages/editor-ui/src/components/CanvasControls.vue +++ b/packages/editor-ui/src/components/CanvasControls.vue @@ -44,7 +44,7 @@