From 79a162aa546e395c6095aabf6447051fdb35efe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 21 Feb 2022 15:45:17 +0100 Subject: [PATCH 01/19] :zap: Make `getTemplate` async --- .../UserManagement/email/UserManagementMailer.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/UserManagement/email/UserManagementMailer.ts b/packages/cli/src/UserManagement/email/UserManagementMailer.ts index 6297e3aca316a..8bda8cd95dd98 100644 --- a/packages/cli/src/UserManagement/email/UserManagementMailer.ts +++ b/packages/cli/src/UserManagement/email/UserManagementMailer.ts @@ -1,6 +1,8 @@ +/* eslint-disable import/no-cycle */ import { existsSync, readFileSync } from 'fs'; import { IDataObject } from 'n8n-workflow'; import { join as pathJoin } from 'path'; +import { GenericHelpers } from '../..'; import config = require('../../../config'); import { InviteEmailData, @@ -10,8 +12,11 @@ import { } from './Interfaces'; import { NodeMailer } from './NodeMailer'; -function getTemplate(configKeyName: string, defaultFilename: string) { - const templateOverride = config.get(`userManagement.emails.templates.${configKeyName}`) as string; +async function getTemplate(configKeyName: string, defaultFilename: string) { + const templateOverride = (await GenericHelpers.getConfigValue( + `userManagement.emails.templates.${configKeyName}`, + )) as string; + let template; if (templateOverride && existsSync(templateOverride)) { template = readFileSync(templateOverride, { @@ -46,7 +51,7 @@ export class UserManagementMailer { } async invite(inviteEmailData: InviteEmailData): Promise { - let template = getTemplate('invite', 'invite.html'); + let template = await getTemplate('invite', 'invite.html'); template = replaceStrings(template, inviteEmailData); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -61,7 +66,7 @@ export class UserManagementMailer { } async passwordReset(passwordResetData: PasswordResetData): Promise { - let template = getTemplate('passwordReset', 'passwordReset.html'); + let template = await getTemplate('passwordReset', 'passwordReset.html'); template = replaceStrings(template, passwordResetData); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion From 2ad6ed89eb009598d417f785fab242e9cd81efd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 21 Feb 2022 15:45:34 +0100 Subject: [PATCH 02/19] :zap: Remove query builder from `getCredentials` --- packages/cli/src/CredentialsHelper.ts | 39 ++++++++++++++------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/packages/cli/src/CredentialsHelper.ts b/packages/cli/src/CredentialsHelper.ts index d77f92eab345f..85b83474b957c 100644 --- a/packages/cli/src/CredentialsHelper.ts +++ b/packages/cli/src/CredentialsHelper.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable no-restricted-syntax */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ @@ -218,40 +219,40 @@ export class CredentialsHelper extends ICredentialsHelper { /** * Returns the credentials instance * - * @param {INodeCredentialsDetails} nodeCredentials id and name to return instance of - * @param {string} type Type of the credentials to return instance of + * @param {INodeCredentialsDetails} nodeCredential id and name to return instance of + * @param {string} type Type of the credential to return instance of * @returns {Credentials} * @memberof CredentialsHelper */ async getCredentials( - nodeCredentials: INodeCredentialsDetails, + nodeCredential: INodeCredentialsDetails, type: string, userId?: string, ): Promise { - if (!nodeCredentials.id) { - throw new Error(`Credentials "${nodeCredentials.name}" for type "${type}" don't have an ID.`); + if (!nodeCredential.id) { + throw new Error(`Credential "${nodeCredential.name}" of type "${type}" has no ID.`); } - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const qb = Db.collections.Credentials!.createQueryBuilder('c'); - qb.where('c.id = :id and c.type = :type', { id: nodeCredentials.id, type }); - if (userId) { - // TODO UM: implement this. - // qb. - } - const credentials = await qb.getOne(); + const credential = userId + ? await Db.collections + .SharedCredentials!.findOneOrFail({ + relations: ['credentials', 'user'], + where: { id: nodeCredential.id, type, user: { id: userId } }, + }) + .then((shared) => shared.credentials) + : await Db.collections.Credentials!.findOneOrFail({ id: nodeCredential.id, type }); - if (!credentials) { + if (!credential) { throw new Error( - `Credentials with ID "${nodeCredentials.id}" don't exist for type "${type}".`, + `Credential with ID "${nodeCredential.id}" does not exist for type "${type}".`, ); } return new Credentials( - { id: credentials.id.toString(), name: credentials.name }, - credentials.type, - credentials.nodesAccess, - credentials.data, + { id: credential.id.toString(), name: credential.name }, + credential.type, + credential.nodesAccess, + credential.data, ); } From 295f21d1539f2bcbf66bf842378ba5f18bcc61a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 21 Feb 2022 15:49:38 +0100 Subject: [PATCH 03/19] :zap: Add save manual executions log message --- packages/cli/commands/start.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/cli/commands/start.ts b/packages/cli/commands/start.ts index 079cbc1971acb..6f858d3bd9ca1 100644 --- a/packages/cli/commands/start.ts +++ b/packages/cli/commands/start.ts @@ -389,6 +389,12 @@ export class Start extends Command { const editorUrl = GenericHelpers.getBaseUrl(); this.log(`\nEditor is now accessible via:\n${editorUrl}`); + const saveManualExecutions = config.get('executions.saveDataManualExecutions') as boolean; + + if (saveManualExecutions) { + this.log('\nManual executions will be saved only for the owner'); + } + // Allow to open n8n editor by pressing "o" if (Boolean(process.stdout.isTTY) && process.stdin.setRawMode) { process.stdin.setRawMode(true); From 95a6295fe0a74769c082e43654fd697b4a0d6110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 21 Feb 2022 15:57:29 +0100 Subject: [PATCH 04/19] :rewind: Restore and hide migrations logs --- .../migrations/1626183952959-AddWaitColumn.ts | 4 ++ ...1630451444017-UpdateWorkflowCredentials.ts | 3 + ...1644424784709-AddExecutionEntityIndexes.ts | 48 ++++++++------- .../migrations/1626176912946-AddwaitTill.ts | 6 ++ ...1630419189837-UpdateWorkflowCredentials.ts | 3 + ...1644422880309-AddExecutionEntityIndexes.ts | 59 ++++++++++--------- .../migrations/1621707690587-AddWaitColumn.ts | 5 ++ ...1630330987096-UpdateWorkflowCredentials.ts | 3 + ...1644421939510-AddExecutionEntityIndexes.ts | 45 +++++++------- 9 files changed, 105 insertions(+), 71 deletions(-) diff --git a/packages/cli/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.ts b/packages/cli/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.ts index ee2aa560e1177..d6cba6e165e07 100644 --- a/packages/cli/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.ts +++ b/packages/cli/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.ts @@ -1,11 +1,15 @@ import {MigrationInterface, QueryRunner} from "typeorm"; import * as config from '../../../../config'; +import { isTestRun } from "../../../../test/integration/shared/utils"; export class AddWaitColumnId1626183952959 implements MigrationInterface { name = 'AddWaitColumnId1626183952959'; async up(queryRunner: QueryRunner): Promise { const tablePrefix = config.get('database.tablePrefix'); + !isTestRun && console.log( + '\n\nINFO: Started with migration for wait functionality.\n Depending on the number of saved executions, that may take a little bit.\n\n', + ); await queryRunner.query('ALTER TABLE `' + tablePrefix + 'execution_entity` ADD `waitTill` DATETIME NULL'); await queryRunner.query('CREATE INDEX `IDX_' + tablePrefix + 'ca4a71b47f28ac6ea88293a8e2` ON `' + tablePrefix + 'execution_entity` (`waitTill`)'); diff --git a/packages/cli/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.ts b/packages/cli/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.ts index 3357f868537fd..ea26bcada16c3 100644 --- a/packages/cli/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.ts +++ b/packages/cli/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.ts @@ -1,5 +1,6 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import config = require('../../../../config'); +import { isTestRun } from '../../../../test/integration/shared/utils'; import { MigrationHelpers } from '../../MigrationHelpers'; // replacing the credentials in workflows and execution @@ -9,6 +10,8 @@ export class UpdateWorkflowCredentials1630451444017 implements MigrationInterfac name = 'UpdateWorkflowCredentials1630451444017'; public async up(queryRunner: QueryRunner): Promise { + !isTestRun && console.log('Start migration', this.name); + !isTestRun && console.time(this.name); const tablePrefix = config.get('database.tablePrefix'); const helpers = new MigrationHelpers(queryRunner); diff --git a/packages/cli/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.ts b/packages/cli/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.ts index 62ced030772bd..ad87a0c8606c6 100644 --- a/packages/cli/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.ts +++ b/packages/cli/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.ts @@ -1,32 +1,36 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import * as config from '../../../../config'; +import { isTestRun } from '../../../../test/integration/shared/utils'; export class AddExecutionEntityIndexes1644424784709 implements MigrationInterface { - name = 'AddExecutionEntityIndexes1644424784709' + name = 'AddExecutionEntityIndexes1644424784709' - public async up(queryRunner: QueryRunner): Promise { - console.log('\n\nINFO: Started migration for execution entity indexes.\n Depending on the number of saved executions, it may take a while.\n\n'); + public async up(queryRunner: QueryRunner): Promise { + !isTestRun && + console.log( + '\n\nINFO: Started migration for execution entity indexes.\n Depending on the number of saved executions, it may take a while.\n\n', + ); - const tablePrefix = config.get('database.tablePrefix'); + const tablePrefix = config.get('database.tablePrefix'); - await queryRunner.query('DROP INDEX `IDX_c4d999a5e90784e8caccf5589d` ON `' + tablePrefix + 'execution_entity`'); - await queryRunner.query('DROP INDEX `IDX_ca4a71b47f28ac6ea88293a8e2` ON `' + tablePrefix + 'execution_entity`'); - await queryRunner.query('CREATE INDEX `IDX_06da892aaf92a48e7d3e400003` ON `' + tablePrefix + 'execution_entity` (`workflowId`, `waitTill`, `id`)'); - await queryRunner.query('CREATE INDEX `IDX_78d62b89dc1433192b86dce18a` ON `' + tablePrefix + 'execution_entity` (`workflowId`, `finished`, `id`)'); - await queryRunner.query('CREATE INDEX `IDX_1688846335d274033e15c846a4` ON `' + tablePrefix + 'execution_entity` (`finished`, `id`)'); - await queryRunner.query('CREATE INDEX `IDX_b94b45ce2c73ce46c54f20b5f9` ON `' + tablePrefix + 'execution_entity` (`waitTill`, `id`)'); - await queryRunner.query('CREATE INDEX `IDX_81fc04c8a17de15835713505e4` ON `' + tablePrefix + 'execution_entity` (`workflowId`, `id`)'); - } + await queryRunner.query('DROP INDEX `IDX_c4d999a5e90784e8caccf5589d` ON `' + tablePrefix + 'execution_entity`'); + await queryRunner.query('DROP INDEX `IDX_ca4a71b47f28ac6ea88293a8e2` ON `' + tablePrefix + 'execution_entity`'); + await queryRunner.query('CREATE INDEX `IDX_06da892aaf92a48e7d3e400003` ON `' + tablePrefix + 'execution_entity` (`workflowId`, `waitTill`, `id`)'); + await queryRunner.query('CREATE INDEX `IDX_78d62b89dc1433192b86dce18a` ON `' + tablePrefix + 'execution_entity` (`workflowId`, `finished`, `id`)'); + await queryRunner.query('CREATE INDEX `IDX_1688846335d274033e15c846a4` ON `' + tablePrefix + 'execution_entity` (`finished`, `id`)'); + await queryRunner.query('CREATE INDEX `IDX_b94b45ce2c73ce46c54f20b5f9` ON `' + tablePrefix + 'execution_entity` (`waitTill`, `id`)'); + await queryRunner.query('CREATE INDEX `IDX_81fc04c8a17de15835713505e4` ON `' + tablePrefix + 'execution_entity` (`workflowId`, `id`)'); + } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.get('database.tablePrefix'); - await queryRunner.query('DROP INDEX `IDX_81fc04c8a17de15835713505e4` ON `' + tablePrefix + 'execution_entity`'); - await queryRunner.query('DROP INDEX `IDX_b94b45ce2c73ce46c54f20b5f9` ON `' + tablePrefix + 'execution_entity`'); - await queryRunner.query('DROP INDEX `IDX_1688846335d274033e15c846a4` ON `' + tablePrefix + 'execution_entity`'); - await queryRunner.query('DROP INDEX `IDX_78d62b89dc1433192b86dce18a` ON `' + tablePrefix + 'execution_entity`'); - await queryRunner.query('DROP INDEX `IDX_06da892aaf92a48e7d3e400003` ON `' + tablePrefix + 'execution_entity`'); - await queryRunner.query('CREATE INDEX `IDX_ca4a71b47f28ac6ea88293a8e2` ON `' + tablePrefix + 'execution_entity` (`waitTill`)'); - await queryRunner.query('CREATE INDEX `IDX_c4d999a5e90784e8caccf5589d` ON `' + tablePrefix + 'execution_entity` (`workflowId`)'); - } + public async down(queryRunner: QueryRunner): Promise { + const tablePrefix = config.get('database.tablePrefix'); + await queryRunner.query('DROP INDEX `IDX_81fc04c8a17de15835713505e4` ON `' + tablePrefix + 'execution_entity`'); + await queryRunner.query('DROP INDEX `IDX_b94b45ce2c73ce46c54f20b5f9` ON `' + tablePrefix + 'execution_entity`'); + await queryRunner.query('DROP INDEX `IDX_1688846335d274033e15c846a4` ON `' + tablePrefix + 'execution_entity`'); + await queryRunner.query('DROP INDEX `IDX_78d62b89dc1433192b86dce18a` ON `' + tablePrefix + 'execution_entity`'); + await queryRunner.query('DROP INDEX `IDX_06da892aaf92a48e7d3e400003` ON `' + tablePrefix + 'execution_entity`'); + await queryRunner.query('CREATE INDEX `IDX_ca4a71b47f28ac6ea88293a8e2` ON `' + tablePrefix + 'execution_entity` (`waitTill`)'); + await queryRunner.query('CREATE INDEX `IDX_c4d999a5e90784e8caccf5589d` ON `' + tablePrefix + 'execution_entity` (`workflowId`)'); + } } diff --git a/packages/cli/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.ts b/packages/cli/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.ts index b37834fa75b0b..3156ccfa33715 100644 --- a/packages/cli/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.ts +++ b/packages/cli/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.ts @@ -1,5 +1,6 @@ import {MigrationInterface, QueryRunner} from "typeorm"; import * as config from '../../../../config'; +import { isTestRun } from "../../../../test/integration/shared/utils"; export class AddwaitTill1626176912946 implements MigrationInterface { name = 'AddwaitTill1626176912946'; @@ -12,6 +13,11 @@ export class AddwaitTill1626176912946 implements MigrationInterface { tablePrefix = schema + '.' + tablePrefix; } + !isTestRun && + console.log( + '\n\nINFO: Started with migration for wait functionality.\n Depending on the number of saved executions, that may take a little bit.\n\n', + ); + await queryRunner.query(`ALTER TABLE ${tablePrefix}execution_entity ADD "waitTill" TIMESTAMP`); await queryRunner.query(`CREATE INDEX IF NOT EXISTS IDX_${tablePrefixPure}ca4a71b47f28ac6ea88293a8e2 ON ${tablePrefix}execution_entity ("waitTill")`); } diff --git a/packages/cli/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.ts b/packages/cli/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.ts index 2061241ce0bd5..ad3f2c45be8d5 100644 --- a/packages/cli/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.ts +++ b/packages/cli/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.ts @@ -1,5 +1,6 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import config = require('../../../../config'); +import { isTestRun } from '../../../../test/integration/shared/utils'; import { MigrationHelpers } from '../../MigrationHelpers'; // replacing the credentials in workflows and execution @@ -9,6 +10,8 @@ export class UpdateWorkflowCredentials1630419189837 implements MigrationInterfac name = 'UpdateWorkflowCredentials1630419189837'; public async up(queryRunner: QueryRunner): Promise { + !isTestRun && console.log('Start migration', this.name); + !isTestRun && console.time(this.name); let tablePrefix = config.get('database.tablePrefix'); const schema = config.get('database.postgresdb.schema'); if (schema) { diff --git a/packages/cli/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.ts b/packages/cli/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.ts index b0b6814b90d0c..4c1ef7af9f96b 100644 --- a/packages/cli/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.ts +++ b/packages/cli/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.ts @@ -1,47 +1,50 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import * as config from '../../../../config'; +import { isTestRun } from '../../../../test/integration/shared/utils'; export class AddExecutionEntityIndexes1644422880309 implements MigrationInterface { - name = 'AddExecutionEntityIndexes1644422880309' + name = 'AddExecutionEntityIndexes1644422880309' - public async up(queryRunner: QueryRunner): Promise { - console.log('\n\nINFO: Started migration for execution entity indexes.\n Depending on the number of saved executions, it may take a while.\n\n'); + public async up(queryRunner: QueryRunner): Promise { + !isTestRun && + console.log( + '\n\nINFO: Started migration for execution entity indexes.\n Depending on the number of saved executions, it may take a while.\n\n', + ); - let tablePrefix = config.get('database.tablePrefix'); + let tablePrefix = config.get('database.tablePrefix'); const tablePrefixPure = tablePrefix; const schema = config.get('database.postgresdb.schema'); - if (schema) { + if (schema) { tablePrefix = schema + '.' + tablePrefix; } - await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}c4d999a5e90784e8caccf5589d"`); - await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}ca4a71b47f28ac6ea88293a8e2"`); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}33228da131bb1112247cf52a42" ON ${tablePrefix}execution_entity ("stoppedAt") `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}58154df94c686818c99fb754ce" ON ${tablePrefix}execution_entity ("workflowId", "waitTill", "id") `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}4f474ac92be81610439aaad61e" ON ${tablePrefix}execution_entity ("workflowId", "finished", "id") `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}72ffaaab9f04c2c1f1ea86e662" ON ${tablePrefix}execution_entity ("finished", "id") `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}85b981df7b444f905f8bf50747" ON ${tablePrefix}execution_entity ("waitTill", "id") `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}d160d4771aba5a0d78943edbe3" ON ${tablePrefix}execution_entity ("workflowId", "id") `); - } - - public async down(queryRunner: QueryRunner): Promise { - let tablePrefix = config.get('database.tablePrefix'); + await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}c4d999a5e90784e8caccf5589d"`); + await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}ca4a71b47f28ac6ea88293a8e2"`); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}33228da131bb1112247cf52a42" ON ${tablePrefix}execution_entity ("stoppedAt") `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}58154df94c686818c99fb754ce" ON ${tablePrefix}execution_entity ("workflowId", "waitTill", "id") `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}4f474ac92be81610439aaad61e" ON ${tablePrefix}execution_entity ("workflowId", "finished", "id") `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}72ffaaab9f04c2c1f1ea86e662" ON ${tablePrefix}execution_entity ("finished", "id") `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}85b981df7b444f905f8bf50747" ON ${tablePrefix}execution_entity ("waitTill", "id") `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}d160d4771aba5a0d78943edbe3" ON ${tablePrefix}execution_entity ("workflowId", "id") `); + } + + public async down(queryRunner: QueryRunner): Promise { + let tablePrefix = config.get('database.tablePrefix'); const tablePrefixPure = tablePrefix; const schema = config.get('database.postgresdb.schema'); - if (schema) { + if (schema) { tablePrefix = schema + '.' + tablePrefix; } - await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}d160d4771aba5a0d78943edbe3"`); - await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}85b981df7b444f905f8bf50747"`); - await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}72ffaaab9f04c2c1f1ea86e662"`); - await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}4f474ac92be81610439aaad61e"`); - await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}58154df94c686818c99fb754ce"`); - await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}33228da131bb1112247cf52a42"`); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}ca4a71b47f28ac6ea88293a8e2" ON ${tablePrefix}execution_entity ("waitTill") `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}c4d999a5e90784e8caccf5589d" ON ${tablePrefix}execution_entity ("workflowId") `); - } - + await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}d160d4771aba5a0d78943edbe3"`); + await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}85b981df7b444f905f8bf50747"`); + await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}72ffaaab9f04c2c1f1ea86e662"`); + await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}4f474ac92be81610439aaad61e"`); + await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}58154df94c686818c99fb754ce"`); + await queryRunner.query(`DROP INDEX IF EXISTS "${schema}"."IDX_${tablePrefixPure}33228da131bb1112247cf52a42"`); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}ca4a71b47f28ac6ea88293a8e2" ON ${tablePrefix}execution_entity ("waitTill") `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_${tablePrefixPure}c4d999a5e90784e8caccf5589d" ON ${tablePrefix}execution_entity ("workflowId") `); + } } diff --git a/packages/cli/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.ts b/packages/cli/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.ts index 89e91ba13686b..b58b30614e5f6 100644 --- a/packages/cli/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.ts +++ b/packages/cli/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.ts @@ -1,11 +1,16 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import * as config from '../../../../config'; +import { isTestRun } from '../../../../test/integration/shared/utils'; export class AddWaitColumn1621707690587 implements MigrationInterface { name = 'AddWaitColumn1621707690587'; async up(queryRunner: QueryRunner): Promise { const tablePrefix = config.get('database.tablePrefix'); + !isTestRun && + console.log( + '\n\nINFO: Started with migration for wait functionality.\n Depending on the number of saved executions, that may take a little bit.\n\n', + ); 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); diff --git a/packages/cli/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.ts b/packages/cli/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.ts index 2da05947095e4..40da0615a3804 100644 --- a/packages/cli/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.ts +++ b/packages/cli/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.ts @@ -1,5 +1,6 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import config = require('../../../../config'); +import { isTestRun } from '../../../../test/integration/shared/utils'; import { MigrationHelpers } from '../../MigrationHelpers'; // replacing the credentials in workflows and execution @@ -9,6 +10,8 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac name = 'UpdateWorkflowCredentials1630330987096'; public async up(queryRunner: QueryRunner): Promise { + !isTestRun && console.log('Start migration', this.name); + !isTestRun && console.time(this.name); const tablePrefix = config.get('database.tablePrefix'); const helpers = new MigrationHelpers(queryRunner); diff --git a/packages/cli/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.ts b/packages/cli/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.ts index 1f6695626ff73..b216c16a5f989 100644 --- a/packages/cli/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.ts +++ b/packages/cli/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.ts @@ -1,31 +1,34 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import * as config from '../../../../config'; +import { isTestRun } from '../../../../test/integration/shared/utils'; export class AddExecutionEntityIndexes1644421939510 implements MigrationInterface { - name = 'AddExecutionEntityIndexes1644421939510' + name = 'AddExecutionEntityIndexes1644421939510' - public async up(queryRunner: QueryRunner): Promise { - console.log('\n\nINFO: Started migration for execution entity indexes.\n Depending on the number of saved executions, it may take a while.\n\n'); + public async up(queryRunner: QueryRunner): Promise { + !isTestRun && + console.log( + '\n\nINFO: Started migration for execution entity indexes.\n Depending on the number of saved executions, it may take a while.\n\n', + ); - const tablePrefix = config.get('database.tablePrefix'); + const tablePrefix = config.get('database.tablePrefix'); - await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2'`); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}06da892aaf92a48e7d3e400003' ON '${tablePrefix}execution_entity' ('workflowId', 'waitTill', 'id') `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}78d62b89dc1433192b86dce18a' ON '${tablePrefix}execution_entity' ('workflowId', 'finished', 'id') `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}1688846335d274033e15c846a4' ON '${tablePrefix}execution_entity' ('finished', 'id') `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}b94b45ce2c73ce46c54f20b5f9' ON '${tablePrefix}execution_entity' ('waitTill', 'id') `); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}81fc04c8a17de15835713505e4' ON '${tablePrefix}execution_entity' ('workflowId', 'id') `); - } + await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2'`); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}06da892aaf92a48e7d3e400003' ON '${tablePrefix}execution_entity' ('workflowId', 'waitTill', 'id') `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}78d62b89dc1433192b86dce18a' ON '${tablePrefix}execution_entity' ('workflowId', 'finished', 'id') `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}1688846335d274033e15c846a4' ON '${tablePrefix}execution_entity' ('finished', 'id') `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}b94b45ce2c73ce46c54f20b5f9' ON '${tablePrefix}execution_entity' ('waitTill', 'id') `); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}81fc04c8a17de15835713505e4' ON '${tablePrefix}execution_entity' ('workflowId', 'id') `); + } - public async down(queryRunner: QueryRunner): Promise { - const tablePrefix = config.get('database.tablePrefix'); - - await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}81fc04c8a17de15835713505e4'`); - await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}b94b45ce2c73ce46c54f20b5f9'`); - await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}1688846335d274033e15c846a4'`); - await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}78d62b89dc1433192b86dce18a'`); - await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}06da892aaf92a48e7d3e400003'`); - await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2' ON '${tablePrefix}execution_entity' ('waitTill') `); - } + public async down(queryRunner: QueryRunner): Promise { + const tablePrefix = config.get('database.tablePrefix'); + await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}81fc04c8a17de15835713505e4'`); + await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}b94b45ce2c73ce46c54f20b5f9'`); + await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}1688846335d274033e15c846a4'`); + await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}78d62b89dc1433192b86dce18a'`); + await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}06da892aaf92a48e7d3e400003'`); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS 'IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2' ON '${tablePrefix}execution_entity' ('waitTill') `); + } } From 32d599b8aa2ceb467cdeb0c76f3ed42098551966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 21 Feb 2022 16:09:21 +0100 Subject: [PATCH 05/19] :zap: Centralize ignore paths check --- .../src/UserManagement/UserManagementHelper.ts | 9 +++++++++ packages/cli/src/UserManagement/routes/index.ts | 15 +++------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/UserManagement/UserManagementHelper.ts b/packages/cli/src/UserManagement/UserManagementHelper.ts index a95b02876f6ae..8eedb391f22a9 100644 --- a/packages/cli/src/UserManagement/UserManagementHelper.ts +++ b/packages/cli/src/UserManagement/UserManagementHelper.ts @@ -53,3 +53,12 @@ export function sanitizeUser(user: User): PublicUser { } = user; return sanitizedUser; } + +/** + * Check if a URL contains an auth-excluded endpoint. + */ +export function isAuthExcluded(url: string, ignoredEndpoints: string[]): boolean { + return !!ignoredEndpoints + .filter(Boolean) // skip empty paths + .find((ignoredEndpoint) => url.includes(ignoredEndpoint)); +} diff --git a/packages/cli/src/UserManagement/routes/index.ts b/packages/cli/src/UserManagement/routes/index.ts index 148991aefb5a2..9e07a30b16576 100644 --- a/packages/cli/src/UserManagement/routes/index.ts +++ b/packages/cli/src/UserManagement/routes/index.ts @@ -18,6 +18,7 @@ import { usersNamespace } from './users'; import { passwordResetNamespace } from './passwordReset'; import { AuthenticatedRequest } from '../../requests'; import { ownerNamespace } from './owner'; +import { isAuthExcluded } from '../UserManagementHelper'; export function addRoutes(this: N8nApp, ignoredEndpoints: string[], restEndpoint: string): void { this.app.use(cookieParser()); @@ -59,22 +60,12 @@ export function addRoutes(this: N8nApp, ignoredEndpoints: string[], restEndpoint (req.method === 'POST' && new RegExp(`/${restEndpoint}/users/[\\w\\d-]*`).test(req.url)) || req.url.startsWith(`/${restEndpoint}/forgot-password`) || req.url.startsWith(`/${restEndpoint}/resolve-password-token`) || - req.url.startsWith(`/${restEndpoint}/change-password`) + req.url.startsWith(`/${restEndpoint}/change-password`) || + isAuthExcluded(req.url, ignoredEndpoints) ) { return next(); } - for (let i = 0; i < ignoredEndpoints.length; i++) { - const path = ignoredEndpoints[i]; - if (!path) { - // Skip empty paths (they might exist) - // eslint-disable-next-line no-continue - continue; - } - if (req.url.includes(path)) { - return next(); - } - } return passport.authenticate('jwt', { session: false })(req, res, next); }); From 34a97cef6d2327bd4d347b508c226a2fe20b683a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 21 Feb 2022 16:51:26 +0100 Subject: [PATCH 06/19] :shirt: Fix build --- packages/cli/src/UserManagement/email/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/src/UserManagement/email/index.ts b/packages/cli/src/UserManagement/email/index.ts index e577648f8e9b2..1d49343ff7840 100644 --- a/packages/cli/src/UserManagement/email/index.ts +++ b/packages/cli/src/UserManagement/email/index.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-cycle */ import { getInstance, UserManagementMailer } from './UserManagementMailer'; export { getInstance, UserManagementMailer }; From c2750129541d861d5bfbe1b5285c9708ae771203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Tue, 22 Feb 2022 17:46:43 +0100 Subject: [PATCH 07/19] :truck: Rename `hasOwner` to `isInstanceOwnerSetUp` --- packages/cli/commands/user-management/reset.ts | 2 +- packages/cli/src/Server.ts | 4 ++-- packages/cli/src/UserManagement/routes/owner.ts | 10 +++++----- packages/cli/src/UserManagement/routes/users.ts | 2 +- .../migrations/1636626154933-CreateUserManagement.ts | 2 +- .../migrations/1636626154934-CreateUserManagement.ts | 2 +- .../migrations/1636626154932-CreateUserManagement.ts | 2 +- packages/cli/test/integration/auth.endpoints.test.ts | 4 ++-- packages/cli/test/integration/me.endpoints.test.ts | 6 +++--- packages/cli/test/integration/owner.endpoints.test.ts | 10 +++++----- .../test/integration/passwordReset.endpoints.test.ts | 2 +- packages/cli/test/integration/shared/utils.ts | 6 +++--- packages/cli/test/integration/users.endpoints.test.ts | 2 +- 13 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/cli/commands/user-management/reset.ts b/packages/cli/commands/user-management/reset.ts index 7b2084a720c0f..451f7524633f4 100644 --- a/packages/cli/commands/user-management/reset.ts +++ b/packages/cli/commands/user-management/reset.ts @@ -50,7 +50,7 @@ export class Reset extends Command { await Db.collections.User!.delete({ id: Not(owner.id) }); await Db.collections.User!.save(Object.assign(owner, this.defaultUserProps)); - await Db.collections.Settings!.update({ key: 'userManagement.hasOwner' }, { value: 'false' }); + await Db.collections.Settings!.update({ key: 'userManagement.isInstanceOwnerSetUp' }, { value: 'false' }); } catch (error) { console.error('Error resetting database. See log messages for details.'); if (error instanceof Error) logger.error(error.message); diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index c19f25623b2a9..50a23eb63aac3 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -319,7 +319,7 @@ class App { userManagement: { enabled: config.get('userManagement.disabled') === false || - config.get('userManagement.hasOwner') === true, + config.get('userManagement.isInstanceOwnerSetUp') === true, smtpSetup: config.get('userManagement.emails.mode') === 'smtp', }, workflowTagsDisabled: config.get('workflowTagsDisabled'), @@ -1260,7 +1260,7 @@ class App { throw new ResponseHelper.ResponseError('Workflow tags are disabled'); } if ( - config.get('userManagement.hasOwner') === true && + config.get('userManagement.isInstanceOwnerSetUp') === true && (req.user as User).globalRole.name !== 'owner' ) { throw new ResponseHelper.ResponseError( diff --git a/packages/cli/src/UserManagement/routes/owner.ts b/packages/cli/src/UserManagement/routes/owner.ts index 64b16b5ffc37f..b1ea283aa2ca1 100644 --- a/packages/cli/src/UserManagement/routes/owner.ts +++ b/packages/cli/src/UserManagement/routes/owner.ts @@ -17,7 +17,7 @@ import { sanitizeUser, validatePassword } from '../UserManagementHelper'; export function ownerNamespace(this: N8nApp): void { /** * Promote a shell into the owner of the n8n instance, - * and enable `hasOwner` instance setting. + * and enable `isInstanceOwnerSetUp` setting. */ this.app.post( `/${this.restEndpoint}/owner`, @@ -25,7 +25,7 @@ export function ownerNamespace(this: N8nApp): void { const { email, firstName, lastName, password } = req.body; const { id: userId } = req.user; - if (config.get('userManagement.hasOwner')) { + if (config.get('userManagement.isInstanceOwnerSetUp')) { Logger.debug( 'Request to claim instance ownership failed because instance owner already exists', { @@ -79,14 +79,14 @@ export function ownerNamespace(this: N8nApp): void { Logger.info('Owner updated successfully', { userId: req.user.id }); - config.set('userManagement.hasOwner', true); + config.set('userManagement.isInstanceOwnerSetUp', true); await Db.collections.Settings!.update( - { key: 'userManagement.hasOwner' }, + { key: 'userManagement.isInstanceOwnerSetUp' }, { value: JSON.stringify(true) }, ); - Logger.debug('Setting hasOwner updated successfully', { userId: req.user.id }); + Logger.debug('Setting isInstanceOwnerSetUp updated successfully', { userId: req.user.id }); await issueCookie(res, owner); diff --git a/packages/cli/src/UserManagement/routes/users.ts b/packages/cli/src/UserManagement/routes/users.ts index 88334a5fcbcae..ff145c5e94354 100644 --- a/packages/cli/src/UserManagement/routes/users.ts +++ b/packages/cli/src/UserManagement/routes/users.ts @@ -41,7 +41,7 @@ export function usersNamespace(this: N8nApp): void { ); } - if (!config.get('userManagement.hasOwner')) { + if (!config.get('userManagement.isInstanceOwnerSetUp')) { Logger.debug( 'Request to send email invite(s) to user(s) failed because emailing was not set up', ); diff --git a/packages/cli/src/databases/mysqldb/migrations/1636626154933-CreateUserManagement.ts b/packages/cli/src/databases/mysqldb/migrations/1636626154933-CreateUserManagement.ts index 5df3cd87eb50f..1282f8aa672d2 100644 --- a/packages/cli/src/databases/mysqldb/migrations/1636626154933-CreateUserManagement.ts +++ b/packages/cli/src/databases/mysqldb/migrations/1636626154933-CreateUserManagement.ts @@ -244,7 +244,7 @@ export class CreateUserManagement1636626154933 implements MigrationInterface { 'INSERT INTO `' + tablePrefix + 'settings` (`key`, value, loadOnStartup) values ' + - '("userManagement.hasOwner", "false", 1)', + '("userManagement.isInstanceOwnerSetUp", "false", 1)', ); } diff --git a/packages/cli/src/databases/postgresdb/migrations/1636626154934-CreateUserManagement.ts b/packages/cli/src/databases/postgresdb/migrations/1636626154934-CreateUserManagement.ts index d8cc484325f5d..f65a8ce1139e8 100644 --- a/packages/cli/src/databases/postgresdb/migrations/1636626154934-CreateUserManagement.ts +++ b/packages/cli/src/databases/postgresdb/migrations/1636626154934-CreateUserManagement.ts @@ -230,7 +230,7 @@ export class CreateUserManagement1636626154934 implements MigrationInterface { 'INSERT INTO "' + tablePrefix + 'settings" ("key", "value", "loadOnStartup") values ' + - "('userManagement.hasOwner', 'false', true)", + "('userManagement.isInstanceOwnerSetUp', 'false', true)", ); } diff --git a/packages/cli/src/databases/sqlite/migrations/1636626154932-CreateUserManagement.ts b/packages/cli/src/databases/sqlite/migrations/1636626154932-CreateUserManagement.ts index 04f3a1cb9a92f..f2ffd1c611672 100644 --- a/packages/cli/src/databases/sqlite/migrations/1636626154932-CreateUserManagement.ts +++ b/packages/cli/src/databases/sqlite/migrations/1636626154932-CreateUserManagement.ts @@ -95,7 +95,7 @@ export class CreateUserManagement1636626154932 implements MigrationInterface { await queryRunner.query(` INSERT INTO "${tablePrefix}settings" (key, value, loadOnStartup) values - ('userManagement.hasOwner', 'false', true) + ('userManagement.isInstanceOwnerSetUp', 'false', true) `); } diff --git a/packages/cli/test/integration/auth.endpoints.test.ts b/packages/cli/test/integration/auth.endpoints.test.ts index f37ba32608a27..145d8714143be 100644 --- a/packages/cli/test/integration/auth.endpoints.test.ts +++ b/packages/cli/test/integration/auth.endpoints.test.ts @@ -37,10 +37,10 @@ describe('auth endpoints', () => { role: globalOwnerRole, }); - config.set('userManagement.hasOwner', true); + config.set('userManagement.isInstanceOwnerSetUp', true); await Db.collections.Settings!.update( - { key: 'userManagement.hasOwner' }, + { key: 'userManagement.isInstanceOwnerSetUp' }, { value: JSON.stringify(true) }, ); }); diff --git a/packages/cli/test/integration/me.endpoints.test.ts b/packages/cli/test/integration/me.endpoints.test.ts index 94f496f64c9c9..0a3a847aa7c6b 100644 --- a/packages/cli/test/integration/me.endpoints.test.ts +++ b/packages/cli/test/integration/me.endpoints.test.ts @@ -214,10 +214,10 @@ describe('/me endpoints', () => { await Db.collections.User!.save(newMember); - config.set('userManagement.hasOwner', true); + config.set('userManagement.isInstanceOwnerSetUp', true); await Db.collections.Settings!.update( - { key: 'userManagement.hasOwner' }, + { key: 'userManagement.isInstanceOwnerSetUp' }, { value: JSON.stringify(true) }, ); }); @@ -390,7 +390,7 @@ describe('/me endpoints', () => { globalRole: globalOwnerRole, }); - config.set('userManagement.hasOwner', true); + config.set('userManagement.isInstanceOwnerSetUp', true); }); afterEach(async () => { diff --git a/packages/cli/test/integration/owner.endpoints.test.ts b/packages/cli/test/integration/owner.endpoints.test.ts index c5c31717ed8ad..be989027088ea 100644 --- a/packages/cli/test/integration/owner.endpoints.test.ts +++ b/packages/cli/test/integration/owner.endpoints.test.ts @@ -35,7 +35,7 @@ describe('/owner endpoints', () => { return getConnection().close(); }); - test('POST /owner should create owner and enable hasOwner setting', async () => { + test('POST /owner should create owner and enable isInstanceOwnerSetUp', async () => { const owner = await Db.collections.User!.findOneOrFail(); const authOwnerAgent = await utils.createAgent(app, { auth: true, user: owner }); @@ -70,11 +70,11 @@ describe('/owner endpoints', () => { expect(storedOwner.firstName).toBe(TEST_USER.firstName); expect(storedOwner.lastName).toBe(TEST_USER.lastName); - const hasOwnerConfig = config.get('userManagement.hasOwner'); - expect(hasOwnerConfig).toBe(true); + const isInstanceOwnerSetUpConfig = config.get('userManagement.isInstanceOwnerSetUp'); + expect(isInstanceOwnerSetUpConfig).toBe(true); - const hasOwnerSetting = await utils.getHasOwnerSetting(); - expect(hasOwnerSetting).toBe(true); + const isInstanceOwnerSetUpSetting = await utils.getisInstanceOwnerSetUpSetting(); + expect(isInstanceOwnerSetUpSetting).toBe(true); }); test('POST /owner should fail with invalid inputs', async () => { diff --git a/packages/cli/test/integration/passwordReset.endpoints.test.ts b/packages/cli/test/integration/passwordReset.endpoints.test.ts index 7adbfd94a9d75..12fadbc398d6a 100644 --- a/packages/cli/test/integration/passwordReset.endpoints.test.ts +++ b/packages/cli/test/integration/passwordReset.endpoints.test.ts @@ -34,7 +34,7 @@ beforeEach(async () => { jest.mock('../../config'); }); - config.set('userManagement.hasOwner', true); + config.set('userManagement.isInstanceOwnerSetUp', true); config.set('userManagement.emails.mode', ''); await utils.createUser({ diff --git a/packages/cli/test/integration/shared/utils.ts b/packages/cli/test/integration/shared/utils.ts index 901b7a77e3321..64d5558032f0c 100644 --- a/packages/cli/test/integration/shared/utils.ts +++ b/packages/cli/test/integration/shared/utils.ts @@ -56,7 +56,7 @@ export function initTestServer({ testServer.app.use(bodyParser.urlencoded({ extended: true })); config.set('userManagement.jwtSecret', 'My JWT secret'); - config.set('userManagement.hasOwner', false); + config.set('userManagement.isInstanceOwnerSetUp', false); if (applyAuth) { authMiddleware.apply(testServer, [AUTHLESS_ENDPOINTS, REST_PATH_SEGMENT]); @@ -246,9 +246,9 @@ export function getAuthToken(response: request.Response, authCookieName = 'n8n-a // settings // ---------------------------------- -export async function getHasOwnerSetting() { +export async function getisInstanceOwnerSetUpSetting() { const { value } = await Db.collections.Settings!.findOneOrFail({ - key: 'userManagement.hasOwner', + key: 'userManagement.isInstanceOwnerSetUp', }); return Boolean(value); diff --git a/packages/cli/test/integration/users.endpoints.test.ts b/packages/cli/test/integration/users.endpoints.test.ts index c1c4a78d75b9b..35f36342466a7 100644 --- a/packages/cli/test/integration/users.endpoints.test.ts +++ b/packages/cli/test/integration/users.endpoints.test.ts @@ -64,7 +64,7 @@ beforeEach(async () => { role: globalOwnerRole, }); - config.set('userManagement.hasOwner', true); + config.set('userManagement.isInstanceOwnerSetUp', true); config.set('userManagement.emails.mode', ''); // @ts-ignore hack because config doesn't change for helper UMHelper.isEmailSetUp = false; From 0296ab2078bf25326a27653defc39f48d326eddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Tue, 22 Feb 2022 18:03:26 +0100 Subject: [PATCH 08/19] :zap: Add `isSetUp` flag to `User` --- packages/cli/src/databases/entities/User.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/cli/src/databases/entities/User.ts b/packages/cli/src/databases/entities/User.ts index 40b06464721f7..ae087eec20133 100644 --- a/packages/cli/src/databases/entities/User.ts +++ b/packages/cli/src/databases/entities/User.ts @@ -10,6 +10,7 @@ import { ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn, + AfterLoad, } from 'typeorm'; import { IsEmail, IsString, Length } from 'class-validator'; import config = require('../../../config'); @@ -119,4 +120,14 @@ export class User { setUpdateDate(): void { this.updatedAt = new Date(); } + + /** + * Whether the user is fully set up or is still a shell. + */ + isSetUp: boolean; + + @AfterLoad() + computeIsSetUp(): void { + this.isSetUp = this.password !== null; + } } From c00a560a9de88e9472a9f924bbeb2645b801dce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Tue, 22 Feb 2022 18:12:07 +0100 Subject: [PATCH 09/19] :zap: Add `isSetUp` to FE interface --- packages/editor-ui/src/Interface.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/editor-ui/src/Interface.ts b/packages/editor-ui/src/Interface.ts index b3575c73d0f40..4b74a24a76d73 100644 --- a/packages/editor-ui/src/Interface.ts +++ b/packages/editor-ui/src/Interface.ts @@ -793,6 +793,7 @@ export interface IUserResponse { id: string; }; personalizationAnswers?: IPersonalizationSurveyAnswers | null; + isSetUp: boolean; } export interface IInviteResponse { From 4a29405edc80d7e3a7c71fe1463ca97a86a75279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Tue, 22 Feb 2022 18:18:40 +0100 Subject: [PATCH 10/19] :zap: Adjust `isSetUp` checks on FE --- packages/editor-ui/src/modules/users.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/editor-ui/src/modules/users.ts b/packages/editor-ui/src/modules/users.ts index c5e9164245ff2..4ae2fd5d52126 100644 --- a/packages/editor-ui/src/modules/users.ts +++ b/packages/editor-ui/src/modules/users.ts @@ -13,9 +13,9 @@ import { } from '../Interface'; import { getPersonalizedNodeTypes, isAuthorized, PERMISSIONS, ROLE } from './userHelpers'; -const isDefaultUser = (user: IUserResponse | null) => Boolean(user && !user.email && user.globalRole && user.globalRole.name === ROLE.Owner); +const isDefaultUser = (user: IUserResponse | null) => Boolean(user && !user.isSetUp && user.globalRole && user.globalRole.name === ROLE.Owner); -const isPendingUser = (user: IUserResponse | null) => Boolean(user && user.email && !user.firstName && !user.lastName); +const isPendingUser = (user: IUserResponse | null) => Boolean(user && user.isSetUp && !user.firstName && !user.lastName); const module: Module = { From 027e0bb97a36094cb46e19ecb1fe386b23222972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Tue, 22 Feb 2022 18:49:41 +0100 Subject: [PATCH 11/19] :shirt: Fix build --- packages/cli/commands/user-management/reset.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/cli/commands/user-management/reset.ts b/packages/cli/commands/user-management/reset.ts index 451f7524633f4..88b9e05981016 100644 --- a/packages/cli/commands/user-management/reset.ts +++ b/packages/cli/commands/user-management/reset.ts @@ -50,7 +50,10 @@ export class Reset extends Command { await Db.collections.User!.delete({ id: Not(owner.id) }); await Db.collections.User!.save(Object.assign(owner, this.defaultUserProps)); - await Db.collections.Settings!.update({ key: 'userManagement.isInstanceOwnerSetUp' }, { value: 'false' }); + await Db.collections.Settings!.update( + { key: 'userManagement.isInstanceOwnerSetUp' }, + { value: 'false' }, + ); } catch (error) { console.error('Error resetting database. See log messages for details.'); if (error instanceof Error) logger.error(error.message); From 497440d16ab49937e4cc7eb3635a3dac26cda91d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 23 Feb 2022 14:28:26 +0100 Subject: [PATCH 12/19] :zap: Adjust `isPendingUser()` check --- packages/editor-ui/src/modules/users.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor-ui/src/modules/users.ts b/packages/editor-ui/src/modules/users.ts index 4ae2fd5d52126..d361706202b56 100644 --- a/packages/editor-ui/src/modules/users.ts +++ b/packages/editor-ui/src/modules/users.ts @@ -15,7 +15,7 @@ import { getPersonalizedNodeTypes, isAuthorized, PERMISSIONS, ROLE } from './use const isDefaultUser = (user: IUserResponse | null) => Boolean(user && !user.isSetUp && user.globalRole && user.globalRole.name === ROLE.Owner); -const isPendingUser = (user: IUserResponse | null) => Boolean(user && user.isSetUp && !user.firstName && !user.lastName); +const isPendingUser = (user: IUserResponse | null) => Boolean(user && !user.isSetUp && user.globalRole && user.globalRole.name === ROLE.Member); const module: Module = { From 75514aa514931c30c518d24e34b4c099e8d5795b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 23 Feb 2022 14:33:51 +0100 Subject: [PATCH 13/19] :truck: Shorten helper name --- packages/cli/test/integration/owner.endpoints.test.ts | 2 +- packages/cli/test/integration/shared/utils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/test/integration/owner.endpoints.test.ts b/packages/cli/test/integration/owner.endpoints.test.ts index be989027088ea..95eef701aa800 100644 --- a/packages/cli/test/integration/owner.endpoints.test.ts +++ b/packages/cli/test/integration/owner.endpoints.test.ts @@ -73,7 +73,7 @@ describe('/owner endpoints', () => { const isInstanceOwnerSetUpConfig = config.get('userManagement.isInstanceOwnerSetUp'); expect(isInstanceOwnerSetUpConfig).toBe(true); - const isInstanceOwnerSetUpSetting = await utils.getisInstanceOwnerSetUpSetting(); + const isInstanceOwnerSetUpSetting = await utils.isInstanceOwnerSetUp(); expect(isInstanceOwnerSetUpSetting).toBe(true); }); diff --git a/packages/cli/test/integration/shared/utils.ts b/packages/cli/test/integration/shared/utils.ts index 81ed1d968e4a0..331a1decaed00 100644 --- a/packages/cli/test/integration/shared/utils.ts +++ b/packages/cli/test/integration/shared/utils.ts @@ -311,7 +311,7 @@ export function getAuthToken(response: request.Response, authCookieName = 'n8n-a // settings // ---------------------------------- -export async function getisInstanceOwnerSetUpSetting() { +export async function isInstanceOwnerSetUp() { const { value } = await Db.collections.Settings!.findOneOrFail({ key: 'userManagement.isInstanceOwnerSetUp', }); From d27ee4d8758a9cf793a0604ac7d7497be4d0f54c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Thu, 24 Feb 2022 12:33:21 +0100 Subject: [PATCH 14/19] :zap: Refactor as `isPending` per feedback --- packages/cli/src/databases/entities/User.ts | 8 ++++---- packages/editor-ui/src/Interface.ts | 2 +- packages/editor-ui/src/modules/users.ts | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/databases/entities/User.ts b/packages/cli/src/databases/entities/User.ts index ae087eec20133..f16991cc0986d 100644 --- a/packages/cli/src/databases/entities/User.ts +++ b/packages/cli/src/databases/entities/User.ts @@ -122,12 +122,12 @@ export class User { } /** - * Whether the user is fully set up or is still a shell. + * Whether the user is pending setup completion. */ - isSetUp: boolean; + isPending: boolean; @AfterLoad() - computeIsSetUp(): void { - this.isSetUp = this.password !== null; + computeIsPending(): void { + this.isPending = this.password === null; } } diff --git a/packages/editor-ui/src/Interface.ts b/packages/editor-ui/src/Interface.ts index 4b74a24a76d73..3a52fafd757ef 100644 --- a/packages/editor-ui/src/Interface.ts +++ b/packages/editor-ui/src/Interface.ts @@ -793,7 +793,7 @@ export interface IUserResponse { id: string; }; personalizationAnswers?: IPersonalizationSurveyAnswers | null; - isSetUp: boolean; + isPending: boolean; } export interface IInviteResponse { diff --git a/packages/editor-ui/src/modules/users.ts b/packages/editor-ui/src/modules/users.ts index d361706202b56..766979ea73344 100644 --- a/packages/editor-ui/src/modules/users.ts +++ b/packages/editor-ui/src/modules/users.ts @@ -13,9 +13,9 @@ import { } from '../Interface'; import { getPersonalizedNodeTypes, isAuthorized, PERMISSIONS, ROLE } from './userHelpers'; -const isDefaultUser = (user: IUserResponse | null) => Boolean(user && !user.isSetUp && user.globalRole && user.globalRole.name === ROLE.Owner); +const isDefaultUser = (user: IUserResponse | null) => Boolean(user && user.isPending && user.globalRole && user.globalRole.name === ROLE.Owner); -const isPendingUser = (user: IUserResponse | null) => Boolean(user && !user.isSetUp && user.globalRole && user.globalRole.name === ROLE.Member); +const isPendingUser = (user: IUserResponse | null) => Boolean(user && user.isPending); const module: Module = { From edfb0b2e72aedb0ac08114bafaead5a88f74746c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 28 Feb 2022 09:24:31 +0100 Subject: [PATCH 15/19] :pencil2: Update log message --- packages/cli/commands/start.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/commands/start.ts b/packages/cli/commands/start.ts index 6f858d3bd9ca1..726b5a8603030 100644 --- a/packages/cli/commands/start.ts +++ b/packages/cli/commands/start.ts @@ -392,7 +392,7 @@ export class Start extends Command { const saveManualExecutions = config.get('executions.saveDataManualExecutions') as boolean; if (saveManualExecutions) { - this.log('\nManual executions will be saved only for the owner'); + this.log('\nManual executions will be visible only for the owner'); } // Allow to open n8n editor by pressing "o" From 409fb0f7bea6fd18cb5d73d1e0ad75a0b449e80d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 28 Feb 2022 09:28:04 +0100 Subject: [PATCH 16/19] :zap: Broaden check --- packages/cli/src/databases/entities/User.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/databases/entities/User.ts b/packages/cli/src/databases/entities/User.ts index f16991cc0986d..1e8258c953122 100644 --- a/packages/cli/src/databases/entities/User.ts +++ b/packages/cli/src/databases/entities/User.ts @@ -128,6 +128,6 @@ export class User { @AfterLoad() computeIsPending(): void { - this.isPending = this.password === null; + this.isPending = !!this.password; } } From 249071654b5576a8763f0a103c55312400b35a38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 28 Feb 2022 09:29:50 +0100 Subject: [PATCH 17/19] :fire: Remove unneeded relation --- packages/cli/src/CredentialsHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/CredentialsHelper.ts b/packages/cli/src/CredentialsHelper.ts index 85b83474b957c..eef88ca2c7786 100644 --- a/packages/cli/src/CredentialsHelper.ts +++ b/packages/cli/src/CredentialsHelper.ts @@ -236,7 +236,7 @@ export class CredentialsHelper extends ICredentialsHelper { const credential = userId ? await Db.collections .SharedCredentials!.findOneOrFail({ - relations: ['credentials', 'user'], + relations: ['credentials'], where: { id: nodeCredential.id, type, user: { id: userId } }, }) .then((shared) => shared.credentials) From 152d1127854eb3f42cb6fca928cb8674a00f250a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 28 Feb 2022 09:31:56 +0100 Subject: [PATCH 18/19] :zap: Refactor query --- packages/cli/src/CredentialsHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/CredentialsHelper.ts b/packages/cli/src/CredentialsHelper.ts index eef88ca2c7786..963d80f4493e4 100644 --- a/packages/cli/src/CredentialsHelper.ts +++ b/packages/cli/src/CredentialsHelper.ts @@ -237,7 +237,7 @@ export class CredentialsHelper extends ICredentialsHelper { ? await Db.collections .SharedCredentials!.findOneOrFail({ relations: ['credentials'], - where: { id: nodeCredential.id, type, user: { id: userId } }, + where: { credentials: { id: nodeCredential.id, type }, user: { id: userId } }, }) .then((shared) => shared.credentials) : await Db.collections.Credentials!.findOneOrFail({ id: nodeCredential.id, type }); From d46010724389a9ef69e6e890f3341a0f95d1eb07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 28 Feb 2022 10:05:29 +0100 Subject: [PATCH 19/19] :fire: Re-remove logs from migrations --- .../mysqldb/migrations/1626183952959-AddWaitColumn.ts | 4 ---- .../migrations/1630451444017-UpdateWorkflowCredentials.ts | 3 --- .../migrations/1644424784709-AddExecutionEntityIndexes.ts | 6 ------ .../postgresdb/migrations/1626176912946-AddwaitTill.ts | 6 ------ .../migrations/1630419189837-UpdateWorkflowCredentials.ts | 3 --- .../migrations/1644422880309-AddExecutionEntityIndexes.ts | 5 ----- .../sqlite/migrations/1621707690587-AddWaitColumn.ts | 5 ----- .../migrations/1630330987096-UpdateWorkflowCredentials.ts | 3 --- .../migrations/1644421939510-AddExecutionEntityIndexes.ts | 6 ------ 9 files changed, 41 deletions(-) diff --git a/packages/cli/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.ts b/packages/cli/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.ts index d6cba6e165e07..ee2aa560e1177 100644 --- a/packages/cli/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.ts +++ b/packages/cli/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.ts @@ -1,15 +1,11 @@ import {MigrationInterface, QueryRunner} from "typeorm"; import * as config from '../../../../config'; -import { isTestRun } from "../../../../test/integration/shared/utils"; export class AddWaitColumnId1626183952959 implements MigrationInterface { name = 'AddWaitColumnId1626183952959'; async up(queryRunner: QueryRunner): Promise { const tablePrefix = config.get('database.tablePrefix'); - !isTestRun && console.log( - '\n\nINFO: Started with migration for wait functionality.\n Depending on the number of saved executions, that may take a little bit.\n\n', - ); await queryRunner.query('ALTER TABLE `' + tablePrefix + 'execution_entity` ADD `waitTill` DATETIME NULL'); await queryRunner.query('CREATE INDEX `IDX_' + tablePrefix + 'ca4a71b47f28ac6ea88293a8e2` ON `' + tablePrefix + 'execution_entity` (`waitTill`)'); diff --git a/packages/cli/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.ts b/packages/cli/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.ts index ea26bcada16c3..3357f868537fd 100644 --- a/packages/cli/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.ts +++ b/packages/cli/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.ts @@ -1,6 +1,5 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import config = require('../../../../config'); -import { isTestRun } from '../../../../test/integration/shared/utils'; import { MigrationHelpers } from '../../MigrationHelpers'; // replacing the credentials in workflows and execution @@ -10,8 +9,6 @@ export class UpdateWorkflowCredentials1630451444017 implements MigrationInterfac name = 'UpdateWorkflowCredentials1630451444017'; public async up(queryRunner: QueryRunner): Promise { - !isTestRun && console.log('Start migration', this.name); - !isTestRun && console.time(this.name); const tablePrefix = config.get('database.tablePrefix'); const helpers = new MigrationHelpers(queryRunner); diff --git a/packages/cli/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.ts b/packages/cli/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.ts index 045c3c047db7c..7f7ce7285fb4b 100644 --- a/packages/cli/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.ts +++ b/packages/cli/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.ts @@ -1,16 +1,10 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import * as config from '../../../../config'; -import { isTestRun } from '../../../../test/integration/shared/utils'; export class AddExecutionEntityIndexes1644424784709 implements MigrationInterface { name = 'AddExecutionEntityIndexes1644424784709'; public async up(queryRunner: QueryRunner): Promise { - !isTestRun && - console.log( - '\n\nINFO: Started migration for execution entity indexes.\n Depending on the number of saved executions, it may take a while.\n\n', - ); - const tablePrefix = config.get('database.tablePrefix'); await queryRunner.query( diff --git a/packages/cli/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.ts b/packages/cli/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.ts index 3156ccfa33715..b37834fa75b0b 100644 --- a/packages/cli/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.ts +++ b/packages/cli/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.ts @@ -1,6 +1,5 @@ import {MigrationInterface, QueryRunner} from "typeorm"; import * as config from '../../../../config'; -import { isTestRun } from "../../../../test/integration/shared/utils"; export class AddwaitTill1626176912946 implements MigrationInterface { name = 'AddwaitTill1626176912946'; @@ -13,11 +12,6 @@ export class AddwaitTill1626176912946 implements MigrationInterface { tablePrefix = schema + '.' + tablePrefix; } - !isTestRun && - console.log( - '\n\nINFO: Started with migration for wait functionality.\n Depending on the number of saved executions, that may take a little bit.\n\n', - ); - await queryRunner.query(`ALTER TABLE ${tablePrefix}execution_entity ADD "waitTill" TIMESTAMP`); await queryRunner.query(`CREATE INDEX IF NOT EXISTS IDX_${tablePrefixPure}ca4a71b47f28ac6ea88293a8e2 ON ${tablePrefix}execution_entity ("waitTill")`); } diff --git a/packages/cli/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.ts b/packages/cli/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.ts index ad3f2c45be8d5..2061241ce0bd5 100644 --- a/packages/cli/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.ts +++ b/packages/cli/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.ts @@ -1,6 +1,5 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import config = require('../../../../config'); -import { isTestRun } from '../../../../test/integration/shared/utils'; import { MigrationHelpers } from '../../MigrationHelpers'; // replacing the credentials in workflows and execution @@ -10,8 +9,6 @@ export class UpdateWorkflowCredentials1630419189837 implements MigrationInterfac name = 'UpdateWorkflowCredentials1630419189837'; public async up(queryRunner: QueryRunner): Promise { - !isTestRun && console.log('Start migration', this.name); - !isTestRun && console.time(this.name); let tablePrefix = config.get('database.tablePrefix'); const schema = config.get('database.postgresdb.schema'); if (schema) { diff --git a/packages/cli/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.ts b/packages/cli/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.ts index 3e6811e06eaf1..3f910f24707c9 100644 --- a/packages/cli/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.ts +++ b/packages/cli/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.ts @@ -1,15 +1,10 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import * as config from '../../../../config'; -import { isTestRun } from '../../../../test/integration/shared/utils'; export class AddExecutionEntityIndexes1644422880309 implements MigrationInterface { name = 'AddExecutionEntityIndexes1644422880309'; public async up(queryRunner: QueryRunner): Promise { - !isTestRun && - console.log( - '\n\nINFO: Started migration for execution entity indexes.\n Depending on the number of saved executions, it may take a while.\n\n', - ); let tablePrefix = config.get('database.tablePrefix'); const tablePrefixPure = tablePrefix; diff --git a/packages/cli/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.ts b/packages/cli/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.ts index b58b30614e5f6..89e91ba13686b 100644 --- a/packages/cli/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.ts +++ b/packages/cli/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.ts @@ -1,16 +1,11 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import * as config from '../../../../config'; -import { isTestRun } from '../../../../test/integration/shared/utils'; export class AddWaitColumn1621707690587 implements MigrationInterface { name = 'AddWaitColumn1621707690587'; async up(queryRunner: QueryRunner): Promise { const tablePrefix = config.get('database.tablePrefix'); - !isTestRun && - console.log( - '\n\nINFO: Started with migration for wait functionality.\n Depending on the number of saved executions, that may take a little bit.\n\n', - ); 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); diff --git a/packages/cli/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.ts b/packages/cli/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.ts index 40da0615a3804..2da05947095e4 100644 --- a/packages/cli/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.ts +++ b/packages/cli/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.ts @@ -1,6 +1,5 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import config = require('../../../../config'); -import { isTestRun } from '../../../../test/integration/shared/utils'; import { MigrationHelpers } from '../../MigrationHelpers'; // replacing the credentials in workflows and execution @@ -10,8 +9,6 @@ export class UpdateWorkflowCredentials1630330987096 implements MigrationInterfac name = 'UpdateWorkflowCredentials1630330987096'; public async up(queryRunner: QueryRunner): Promise { - !isTestRun && console.log('Start migration', this.name); - !isTestRun && console.time(this.name); const tablePrefix = config.get('database.tablePrefix'); const helpers = new MigrationHelpers(queryRunner); diff --git a/packages/cli/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.ts b/packages/cli/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.ts index f8b72537d39fd..17c20e5fd7147 100644 --- a/packages/cli/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.ts +++ b/packages/cli/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.ts @@ -1,16 +1,10 @@ import { MigrationInterface, QueryRunner } from 'typeorm'; import * as config from '../../../../config'; -import { isTestRun } from '../../../../test/integration/shared/utils'; export class AddExecutionEntityIndexes1644421939510 implements MigrationInterface { name = 'AddExecutionEntityIndexes1644421939510'; public async up(queryRunner: QueryRunner): Promise { - !isTestRun && - console.log( - '\n\nINFO: Started migration for execution entity indexes.\n Depending on the number of saved executions, it may take a while.\n\n', - ); - const tablePrefix = config.get('database.tablePrefix'); await queryRunner.query(`DROP INDEX IF EXISTS 'IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2'`);