From 21ff1730704193a7f8c89e7b27707ad580dc16ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Tue, 24 Jun 2025 12:33:01 +0200 Subject: [PATCH] refactor(core): Move `DbConnection` to `@n8n/db` (#16616) --- packages/@n8n/constants/src/index.ts | 2 ++ packages/@n8n/constants/src/time.ts | 23 +++++++++++++++++ packages/@n8n/db/package.json | 1 + .../__tests__/db-connection-options.test.ts | 6 ++--- .../__tests__/db-connection.test.ts | 10 +++++--- .../src/connection}/db-connection-options.ts | 15 ++++++----- .../db/src/connection}/db-connection.ts | 7 +++--- packages/@n8n/db/src/index.ts | 2 ++ packages/cli/src/abstract-server.ts | 2 +- .../src/auth/__tests__/auth.service.test.ts | 3 ++- packages/cli/src/auth/auth.service.ts | 3 ++- .../src/collaboration/collaboration.state.ts | 2 +- .../commands/__tests__/execute-batch.test.ts | 2 +- .../src/commands/__tests__/execute.test.ts | 2 +- packages/cli/src/commands/base-command.ts | 2 +- packages/cli/src/commands/db/revert.ts | 4 +-- packages/cli/src/constants.ts | 25 +------------------ .../oauth1-credential.controller.test.ts | 2 +- .../oauth2-credential.controller.test.ts | 3 ++- .../oauth/abstract-oauth.controller.ts | 3 ++- packages/cli/src/license.ts | 3 ++- .../src/metrics/prometheus-metrics.service.ts | 3 ++- .../insights-pruning.service.test.ts | 2 +- .../insights/insights-pruning.service.ts | 3 +-- .../scaling/__tests__/worker-server.test.ts | 2 +- .../cli/src/scaling/multi-main-setup.ee.ts | 2 +- packages/cli/src/scaling/scaling.service.ts | 3 ++- packages/cli/src/scaling/worker-server.ts | 2 +- packages/cli/src/server.ts | 3 ++- .../cli/src/services/cache/cache.service.ts | 2 +- .../executions-pruning.service.test.ts | 3 +-- .../pruning/executions-pruning.service.ts | 6 ++--- .../__tests__/task-broker-ws-server.test.ts | 3 ++- .../__tests__/task-broker.service.test.ts | 2 +- .../auth/task-broker-auth.service.ts | 2 +- .../task-broker/task-broker-ws-server.ts | 3 ++- .../task-broker/task-broker.service.ts | 2 +- ...sk-runner-process-restart-loop-detector.ts | 3 ++- .../workflow-history-manager.ee.ts | 3 +-- .../executions-pruning.service.test.ts | 4 +-- .../shared/db/workflow-statistics.ts | 1 + .../cli/test/integration/shared/test-db.ts | 5 ++-- pnpm-lock.yaml | 3 +++ 43 files changed, 98 insertions(+), 86 deletions(-) create mode 100644 packages/@n8n/constants/src/time.ts rename packages/{cli/src/databases => @n8n/db/src/connection}/__tests__/db-connection-options.test.ts (96%) rename packages/{cli/src/databases => @n8n/db/src/connection}/__tests__/db-connection.test.ts (93%) rename packages/{cli/src/databases => @n8n/db/src/connection}/db-connection-options.ts (93%) rename packages/{cli/src/databases => @n8n/db/src/connection}/db-connection.ts (94%) diff --git a/packages/@n8n/constants/src/index.ts b/packages/@n8n/constants/src/index.ts index d977cdea74..c9616b4b2e 100644 --- a/packages/@n8n/constants/src/index.ts +++ b/packages/@n8n/constants/src/index.ts @@ -101,3 +101,5 @@ export const LDAP_DEFAULT_CONFIGURATION: LdapConfig = { searchPageSize: 0, searchTimeout: 60, }; + +export { Time } from './time'; diff --git a/packages/@n8n/constants/src/time.ts b/packages/@n8n/constants/src/time.ts new file mode 100644 index 0000000000..9109538601 --- /dev/null +++ b/packages/@n8n/constants/src/time.ts @@ -0,0 +1,23 @@ +/** + * Convert time from any time unit to any other unit + */ +export const Time = { + milliseconds: { + toMinutes: 1 / (60 * 1000), + toSeconds: 1 / 1000, + }, + seconds: { + toMilliseconds: 1000, + }, + minutes: { + toMilliseconds: 60 * 1000, + }, + hours: { + toMilliseconds: 60 * 60 * 1000, + toSeconds: 60 * 60, + }, + days: { + toSeconds: 24 * 60 * 60, + toMilliseconds: 24 * 60 * 60 * 1000, + }, +}; diff --git a/packages/@n8n/db/package.json b/packages/@n8n/db/package.json index 64768c29d2..644a287c8c 100644 --- a/packages/@n8n/db/package.json +++ b/packages/@n8n/db/package.json @@ -25,6 +25,7 @@ "@n8n/backend-common": "workspace:^", "@n8n/config": "workspace:^", "@n8n/constants": "workspace:^", + "@n8n/decorators": "workspace:^", "@n8n/di": "workspace:^", "@n8n/permissions": "workspace:^", "@n8n/typeorm": "catalog:", diff --git a/packages/cli/src/databases/__tests__/db-connection-options.test.ts b/packages/@n8n/db/src/connection/__tests__/db-connection-options.test.ts similarity index 96% rename from packages/cli/src/databases/__tests__/db-connection-options.test.ts rename to packages/@n8n/db/src/connection/__tests__/db-connection-options.test.ts index d41b9dbe47..f0d65ee74b 100644 --- a/packages/cli/src/databases/__tests__/db-connection-options.test.ts +++ b/packages/@n8n/db/src/connection/__tests__/db-connection-options.test.ts @@ -1,11 +1,11 @@ import type { ModuleRegistry } from '@n8n/backend-common'; import type { GlobalConfig, InstanceSettingsConfig } from '@n8n/config'; -import { mysqlMigrations } from '@n8n/db'; -import { postgresMigrations } from '@n8n/db'; -import { sqliteMigrations } from '@n8n/db'; import { mock } from 'jest-mock-extended'; import path from 'path'; +import { mysqlMigrations } from '../../migrations/mysqldb'; +import { postgresMigrations } from '../../migrations/postgresdb'; +import { sqliteMigrations } from '../../migrations/sqlite'; import { DbConnectionOptions } from '../db-connection-options'; describe('DbConnectionOptions', () => { diff --git a/packages/cli/src/databases/__tests__/db-connection.test.ts b/packages/@n8n/db/src/connection/__tests__/db-connection.test.ts similarity index 93% rename from packages/cli/src/databases/__tests__/db-connection.test.ts rename to packages/@n8n/db/src/connection/__tests__/db-connection.test.ts index 58469dbf80..239fa772a4 100644 --- a/packages/cli/src/databases/__tests__/db-connection.test.ts +++ b/packages/@n8n/db/src/connection/__tests__/db-connection.test.ts @@ -1,13 +1,13 @@ import type { DatabaseConfig } from '@n8n/config'; -import type { Migration } from '@n8n/db'; -import * as migrationHelper from '@n8n/db'; import { DataSource, type DataSourceOptions } from '@n8n/typeorm'; import { mock, mockDeep } from 'jest-mock-extended'; import type { ErrorReporter } from 'n8n-core'; import { DbConnectionTimeoutError } from 'n8n-workflow'; -import { DbConnection } from '@/databases/db-connection'; -import type { DbConnectionOptions } from '@/databases/db-connection-options'; +import * as migrationHelper from '../../migrations/migration-helpers'; +import type { Migration } from '../../migrations/migration-types'; +import { DbConnection } from '../db-connection'; +import type { DbConnectionOptions } from '../db-connection-options'; jest.mock('@n8n/typeorm', () => ({ DataSource: jest.fn(), @@ -159,6 +159,7 @@ describe('DbConnection', () => { // @ts-expect-error readonly property dataSource.isInitialized = true; dataSource.query.mockResolvedValue([{ '1': 1 }]); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const scheduleNextPingSpy = jest.spyOn(dbConnection as any, 'scheduleNextPing'); // @ts-expect-error private property @@ -189,6 +190,7 @@ describe('DbConnection', () => { }), ); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const pingSpy = jest.spyOn(dbConnection as any, 'ping'); // @ts-expect-error private property diff --git a/packages/cli/src/databases/db-connection-options.ts b/packages/@n8n/db/src/connection/db-connection-options.ts similarity index 93% rename from packages/cli/src/databases/db-connection-options.ts rename to packages/@n8n/db/src/connection/db-connection-options.ts index b9b6aeef01..acd9154b73 100644 --- a/packages/cli/src/databases/db-connection-options.ts +++ b/packages/@n8n/db/src/connection/db-connection-options.ts @@ -1,12 +1,5 @@ import { ModuleRegistry } from '@n8n/backend-common'; import { DatabaseConfig, InstanceSettingsConfig } from '@n8n/config'; -import { - entities, - subscribers, - mysqlMigrations, - postgresMigrations, - sqliteMigrations, -} from '@n8n/db'; import { Service } from '@n8n/di'; import type { DataSourceOptions, LoggerOptions } from '@n8n/typeorm'; import type { MysqlConnectionOptions } from '@n8n/typeorm/driver/mysql/MysqlConnectionOptions'; @@ -14,8 +7,14 @@ import type { PostgresConnectionOptions } from '@n8n/typeorm/driver/postgres/Pos import type { SqliteConnectionOptions } from '@n8n/typeorm/driver/sqlite/SqliteConnectionOptions'; import type { SqlitePooledConnectionOptions } from '@n8n/typeorm/driver/sqlite-pooled/SqlitePooledConnectionOptions'; import { UserError } from 'n8n-workflow'; +import type { TlsOptions } from 'node:tls'; import path from 'path'; -import type { TlsOptions } from 'tls'; + +import { entities } from '../entities'; +import { mysqlMigrations } from '../migrations/mysqldb'; +import { postgresMigrations } from '../migrations/postgresdb'; +import { sqliteMigrations } from '../migrations/sqlite'; +import { subscribers } from '../subscribers'; @Service() export class DbConnectionOptions { diff --git a/packages/cli/src/databases/db-connection.ts b/packages/@n8n/db/src/connection/db-connection.ts similarity index 94% rename from packages/cli/src/databases/db-connection.ts rename to packages/@n8n/db/src/connection/db-connection.ts index 6ac8b26bd6..91e7bd27d8 100644 --- a/packages/cli/src/databases/db-connection.ts +++ b/packages/@n8n/db/src/connection/db-connection.ts @@ -1,16 +1,15 @@ import { inTest } from '@n8n/backend-common'; import { DatabaseConfig } from '@n8n/config'; -import type { Migration } from '@n8n/db'; -import { wrapMigration } from '@n8n/db'; +import { Time } from '@n8n/constants'; import { Memoized } from '@n8n/decorators'; import { Container, Service } from '@n8n/di'; import { DataSource } from '@n8n/typeorm'; import { ErrorReporter } from 'n8n-core'; import { DbConnectionTimeoutError, ensureError } from 'n8n-workflow'; -import { Time } from '@/constants'; - import { DbConnectionOptions } from './db-connection-options'; +import { wrapMigration } from '../migrations/migration-helpers'; +import type { Migration } from '../migrations/migration-types'; type ConnectionState = { connected: boolean; diff --git a/packages/@n8n/db/src/index.ts b/packages/@n8n/db/src/index.ts index 4a8abca223..b207d7a50b 100644 --- a/packages/@n8n/db/src/index.ts +++ b/packages/@n8n/db/src/index.ts @@ -28,3 +28,5 @@ export { postgresMigrations } from './migrations/postgresdb'; export { wrapMigration } from './migrations/migration-helpers'; export * from './migrations/migration-types'; +export { DbConnection } from './connection/db-connection'; +export { DbConnectionOptions } from './connection/db-connection-options'; diff --git a/packages/cli/src/abstract-server.ts b/packages/cli/src/abstract-server.ts index 97f4420b18..b69cbe8d3e 100644 --- a/packages/cli/src/abstract-server.ts +++ b/packages/cli/src/abstract-server.ts @@ -1,5 +1,6 @@ import { inTest, inDevelopment, Logger } from '@n8n/backend-common'; import { GlobalConfig } from '@n8n/config'; +import { DbConnection } from '@n8n/db'; import { OnShutdown } from '@n8n/decorators'; import { Container, Service } from '@n8n/di'; import compression from 'compression'; @@ -11,7 +12,6 @@ import isbot from 'isbot'; import config from '@/config'; import { N8N_VERSION, TEMPLATES_DIR } from '@/constants'; -import { DbConnection } from '@/databases/db-connection'; import { ServiceUnavailableError } from '@/errors/response-errors/service-unavailable.error'; import { ExternalHooks } from '@/external-hooks'; import { rawBodyReader, bodyParser, corsMiddleware } from '@/middlewares'; diff --git a/packages/cli/src/auth/__tests__/auth.service.test.ts b/packages/cli/src/auth/__tests__/auth.service.test.ts index 3952b76883..ff72dd6793 100644 --- a/packages/cli/src/auth/__tests__/auth.service.test.ts +++ b/packages/cli/src/auth/__tests__/auth.service.test.ts @@ -1,4 +1,5 @@ import type { GlobalConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import type { User } from '@n8n/db'; import type { InvalidAuthTokenRepository } from '@n8n/db'; import type { UserRepository } from '@n8n/db'; @@ -8,7 +9,7 @@ import jwt from 'jsonwebtoken'; import { AuthService } from '@/auth/auth.service'; import config from '@/config'; -import { AUTH_COOKIE_NAME, Time } from '@/constants'; +import { AUTH_COOKIE_NAME } from '@/constants'; import type { AuthenticatedRequest } from '@/requests'; import { JwtService } from '@/services/jwt.service'; import type { UrlService } from '@/services/url.service'; diff --git a/packages/cli/src/auth/auth.service.ts b/packages/cli/src/auth/auth.service.ts index da627dfd80..dff1c76ebf 100644 --- a/packages/cli/src/auth/auth.service.ts +++ b/packages/cli/src/auth/auth.service.ts @@ -1,5 +1,6 @@ import { Logger } from '@n8n/backend-common'; import { GlobalConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import type { User } from '@n8n/db'; import { InvalidAuthTokenRepository, UserRepository } from '@n8n/db'; import { Service } from '@n8n/di'; @@ -9,7 +10,7 @@ import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken'; import type { StringValue as TimeUnitValue } from 'ms'; import config from '@/config'; -import { AUTH_COOKIE_NAME, RESPONSE_ERROR_MESSAGES, Time } from '@/constants'; +import { AUTH_COOKIE_NAME, RESPONSE_ERROR_MESSAGES } from '@/constants'; import { AuthError } from '@/errors/response-errors/auth.error'; import { ForbiddenError } from '@/errors/response-errors/forbidden.error'; import { License } from '@/license'; diff --git a/packages/cli/src/collaboration/collaboration.state.ts b/packages/cli/src/collaboration/collaboration.state.ts index 49eae0d14d..3850b7b25f 100644 --- a/packages/cli/src/collaboration/collaboration.state.ts +++ b/packages/cli/src/collaboration/collaboration.state.ts @@ -1,9 +1,9 @@ import type { Iso8601DateTimeString } from '@n8n/api-types'; +import { Time } from '@n8n/constants'; import type { User } from '@n8n/db'; import { Service } from '@n8n/di'; import type { Workflow } from 'n8n-workflow'; -import { Time } from '@/constants'; import { CacheService } from '@/services/cache/cache.service'; type WorkflowCacheHash = Record; diff --git a/packages/cli/src/commands/__tests__/execute-batch.test.ts b/packages/cli/src/commands/__tests__/execute-batch.test.ts index 8c9afcb0b0..4fac3fb424 100644 --- a/packages/cli/src/commands/__tests__/execute-batch.test.ts +++ b/packages/cli/src/commands/__tests__/execute-batch.test.ts @@ -1,6 +1,7 @@ import { GlobalConfig } from '@n8n/config'; import type { User, WorkflowEntity } from '@n8n/db'; import { WorkflowRepository } from '@n8n/db'; +import { DbConnection } from '@n8n/db'; import { Container } from '@n8n/di'; import type { SelectQueryBuilder } from '@n8n/typeorm'; import type { Config } from '@oclif/core'; @@ -8,7 +9,6 @@ import { mock } from 'jest-mock-extended'; import type { IRun } from 'n8n-workflow'; import { ActiveExecutions } from '@/active-executions'; -import { DbConnection } from '@/databases/db-connection'; import { DeprecationService } from '@/deprecation/deprecation.service'; import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus'; import { TelemetryEventRelay } from '@/events/relays/telemetry.event-relay'; diff --git a/packages/cli/src/commands/__tests__/execute.test.ts b/packages/cli/src/commands/__tests__/execute.test.ts index f5e7e0e356..e6ac6406e4 100644 --- a/packages/cli/src/commands/__tests__/execute.test.ts +++ b/packages/cli/src/commands/__tests__/execute.test.ts @@ -1,13 +1,13 @@ import { GlobalConfig } from '@n8n/config'; import type { User, WorkflowEntity } from '@n8n/db'; import { WorkflowRepository } from '@n8n/db'; +import { DbConnection } from '@n8n/db'; import { Container } from '@n8n/di'; import type { Config } from '@oclif/core'; import { mock } from 'jest-mock-extended'; import type { IRun } from 'n8n-workflow'; import { ActiveExecutions } from '@/active-executions'; -import { DbConnection } from '@/databases/db-connection'; import { DeprecationService } from '@/deprecation/deprecation.service'; import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus'; import { TelemetryEventRelay } from '@/events/relays/telemetry.event-relay'; diff --git a/packages/cli/src/commands/base-command.ts b/packages/cli/src/commands/base-command.ts index 4226b75923..83217cad19 100644 --- a/packages/cli/src/commands/base-command.ts +++ b/packages/cli/src/commands/base-command.ts @@ -9,6 +9,7 @@ import { } from '@n8n/backend-common'; import { GlobalConfig } from '@n8n/config'; import { LICENSE_FEATURES } from '@n8n/constants'; +import { DbConnection } from '@n8n/db'; import { Container } from '@n8n/di'; import { Command, Errors } from '@oclif/core'; import { @@ -25,7 +26,6 @@ import type { AbstractServer } from '@/abstract-server'; import config from '@/config'; import { N8N_VERSION, N8N_RELEASE_DATE } from '@/constants'; import * as CrashJournal from '@/crash-journal'; -import { DbConnection } from '@/databases/db-connection'; import { getDataDeduplicationService } from '@/deduplication'; import { DeprecationService } from '@/deprecation/deprecation.service'; import { TestRunCleanupService } from '@/evaluation.ee/test-runner/test-run-cleanup.service.ee'; diff --git a/packages/cli/src/commands/db/revert.ts b/packages/cli/src/commands/db/revert.ts index 99565ef1a6..7abe973e3c 100644 --- a/packages/cli/src/commands/db/revert.ts +++ b/packages/cli/src/commands/db/revert.ts @@ -1,6 +1,6 @@ import { Logger } from '@n8n/backend-common'; import type { Migration } from '@n8n/db'; -import { wrapMigration } from '@n8n/db'; +import { wrapMigration, DbConnectionOptions } from '@n8n/db'; import { Container } from '@n8n/di'; // eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import import type { DataSourceOptions as ConnectionOptions } from '@n8n/typeorm'; @@ -8,8 +8,6 @@ import type { DataSourceOptions as ConnectionOptions } from '@n8n/typeorm'; import { MigrationExecutor, DataSource as Connection } from '@n8n/typeorm'; import { Command, Flags } from '@oclif/core'; -import { DbConnectionOptions } from '@/databases/db-connection-options'; - // This function is extracted to make it easier to unit test it. // Mocking turned into a mess due to this command using typeorm and the db // config directly and customizing and monkey patching parts. diff --git a/packages/cli/src/constants.ts b/packages/cli/src/constants.ts index 944887091a..d534f55cfc 100644 --- a/packages/cli/src/constants.ts +++ b/packages/cli/src/constants.ts @@ -1,3 +1,4 @@ +import { Time } from '@n8n/constants'; import { readFileSync, statSync } from 'fs'; import type { n8n } from 'n8n-core'; import type { ITaskDataConnections } from 'n8n-workflow'; @@ -74,30 +75,6 @@ export const CREDENTIAL_BLANKING_VALUE = '__n8n_BLANK_VALUE_e5362baf-c777-4d57-a export const UM_FIX_INSTRUCTION = 'Please fix the database by running ./packages/cli/bin/n8n user-management:reset'; -/** - * Convert time from any time unit to any other unit - */ -export const Time = { - milliseconds: { - toMinutes: 1 / (60 * 1000), - toSeconds: 1 / 1000, - }, - seconds: { - toMilliseconds: 1000, - }, - minutes: { - toMilliseconds: 60 * 1000, - }, - hours: { - toMilliseconds: 60 * 60 * 1000, - toSeconds: 60 * 60, - }, - days: { - toSeconds: 24 * 60 * 60, - toMilliseconds: 24 * 60 * 60 * 1000, - }, -}; - export const MIN_PASSWORD_CHAR_LENGTH = 8; export const MAX_PASSWORD_CHAR_LENGTH = 64; diff --git a/packages/cli/src/controllers/oauth/__tests__/oauth1-credential.controller.test.ts b/packages/cli/src/controllers/oauth/__tests__/oauth1-credential.controller.test.ts index baa0e1c503..f4d4fe6357 100644 --- a/packages/cli/src/controllers/oauth/__tests__/oauth1-credential.controller.test.ts +++ b/packages/cli/src/controllers/oauth/__tests__/oauth1-credential.controller.test.ts @@ -1,4 +1,5 @@ import { Logger } from '@n8n/backend-common'; +import { Time } from '@n8n/constants'; import type { CredentialsEntity } from '@n8n/db'; import type { User } from '@n8n/db'; import { CredentialsRepository } from '@n8n/db'; @@ -10,7 +11,6 @@ import { Cipher, type InstanceSettings, ExternalSecretsProxy } from 'n8n-core'; import type { IWorkflowExecuteAdditionalData } from 'n8n-workflow'; import nock from 'nock'; -import { Time } from '@/constants'; import { OAuth1CredentialController } from '@/controllers/oauth/oauth1-credential.controller'; import { CredentialsFinderService } from '@/credentials/credentials-finder.service'; import { CredentialsHelper } from '@/credentials-helper'; diff --git a/packages/cli/src/controllers/oauth/__tests__/oauth2-credential.controller.test.ts b/packages/cli/src/controllers/oauth/__tests__/oauth2-credential.controller.test.ts index 129a552919..4f5a003a92 100644 --- a/packages/cli/src/controllers/oauth/__tests__/oauth2-credential.controller.test.ts +++ b/packages/cli/src/controllers/oauth/__tests__/oauth2-credential.controller.test.ts @@ -1,4 +1,5 @@ import { Logger } from '@n8n/backend-common'; +import { Time } from '@n8n/constants'; import type { CredentialsEntity } from '@n8n/db'; import type { User } from '@n8n/db'; import { CredentialsRepository } from '@n8n/db'; @@ -10,7 +11,7 @@ import { Cipher, type InstanceSettings, ExternalSecretsProxy } from 'n8n-core'; import type { IWorkflowExecuteAdditionalData } from 'n8n-workflow'; import nock from 'nock'; -import { CREDENTIAL_BLANKING_VALUE, Time } from '@/constants'; +import { CREDENTIAL_BLANKING_VALUE } from '@/constants'; import { OAuth2CredentialController } from '@/controllers/oauth/oauth2-credential.controller'; import { CredentialsFinderService } from '@/credentials/credentials-finder.service'; import { CredentialsHelper } from '@/credentials-helper'; diff --git a/packages/cli/src/controllers/oauth/abstract-oauth.controller.ts b/packages/cli/src/controllers/oauth/abstract-oauth.controller.ts index a79bbe870e..abedfd1557 100644 --- a/packages/cli/src/controllers/oauth/abstract-oauth.controller.ts +++ b/packages/cli/src/controllers/oauth/abstract-oauth.controller.ts @@ -1,5 +1,6 @@ import { Logger } from '@n8n/backend-common'; import { GlobalConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import type { CredentialsEntity, ICredentialsDb } from '@n8n/db'; import { CredentialsRepository } from '@n8n/db'; import { Service } from '@n8n/di'; @@ -9,7 +10,7 @@ import { Credentials } from 'n8n-core'; import type { ICredentialDataDecryptedObject, IWorkflowExecuteAdditionalData } from 'n8n-workflow'; import { jsonParse, UnexpectedError } from 'n8n-workflow'; -import { RESPONSE_ERROR_MESSAGES, Time } from '@/constants'; +import { RESPONSE_ERROR_MESSAGES } from '@/constants'; import { CredentialsFinderService } from '@/credentials/credentials-finder.service'; import { CredentialsHelper } from '@/credentials-helper'; import { AuthError } from '@/errors/response-errors/auth.error'; diff --git a/packages/cli/src/license.ts b/packages/cli/src/license.ts index fb6fb111e2..6441f74003 100644 --- a/packages/cli/src/license.ts +++ b/packages/cli/src/license.ts @@ -4,6 +4,7 @@ import { GlobalConfig } from '@n8n/config'; import { LICENSE_FEATURES, LICENSE_QUOTAS, + Time, UNLIMITED_LICENSE_QUOTA, type BooleanLicenseFeature, type NumericLicenseFeature, @@ -18,7 +19,7 @@ import { InstanceSettings } from 'n8n-core'; import config from '@/config'; import { LicenseMetricsService } from '@/metrics/license-metrics.service'; -import { N8N_VERSION, SETTINGS_LICENSE_CERT_KEY, Time } from './constants'; +import { N8N_VERSION, SETTINGS_LICENSE_CERT_KEY } from './constants'; const LICENSE_RENEWAL_DISABLED_WARNING = 'Automatic license renewal is disabled. The license will not renew automatically, and access to licensed features may be lost!'; diff --git a/packages/cli/src/metrics/prometheus-metrics.service.ts b/packages/cli/src/metrics/prometheus-metrics.service.ts index 05eb8bc3fa..9dec9e41d9 100644 --- a/packages/cli/src/metrics/prometheus-metrics.service.ts +++ b/packages/cli/src/metrics/prometheus-metrics.service.ts @@ -1,4 +1,5 @@ import { GlobalConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import { WorkflowRepository } from '@n8n/db'; import { Service } from '@n8n/di'; import type express from 'express'; @@ -10,7 +11,7 @@ import promClient, { type Counter, type Gauge } from 'prom-client'; import semverParse from 'semver/functions/parse'; import config from '@/config'; -import { N8N_VERSION, Time } from '@/constants'; +import { N8N_VERSION } from '@/constants'; import type { EventMessageTypes } from '@/eventbus'; import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus'; import { EventService } from '@/events/event.service'; diff --git a/packages/cli/src/modules/insights/__tests__/insights-pruning.service.test.ts b/packages/cli/src/modules/insights/__tests__/insights-pruning.service.test.ts index 2bb607572d..f21e9a6063 100644 --- a/packages/cli/src/modules/insights/__tests__/insights-pruning.service.test.ts +++ b/packages/cli/src/modules/insights/__tests__/insights-pruning.service.test.ts @@ -1,10 +1,10 @@ import type { LicenseState } from '@n8n/backend-common'; import { mockLogger } from '@n8n/backend-test-utils'; +import { Time } from '@n8n/constants'; import { Container } from '@n8n/di'; import { mock } from 'jest-mock-extended'; import { DateTime } from 'luxon'; -import { Time } from '@/constants'; import { createTeamProject } from '@test-integration/db/projects'; import { createWorkflow } from '@test-integration/db/workflows'; import * as testDb from '@test-integration/test-db'; diff --git a/packages/cli/src/modules/insights/insights-pruning.service.ts b/packages/cli/src/modules/insights/insights-pruning.service.ts index 6878aa3e08..ec58935a36 100644 --- a/packages/cli/src/modules/insights/insights-pruning.service.ts +++ b/packages/cli/src/modules/insights/insights-pruning.service.ts @@ -1,9 +1,8 @@ import { LicenseState, Logger } from '@n8n/backend-common'; +import { Time } from '@n8n/constants'; import { Service } from '@n8n/di'; import { strict } from 'assert'; -import { Time } from '@/constants'; - import { InsightsByPeriodRepository } from './database/repositories/insights-by-period.repository'; import { InsightsConfig } from './insights.config'; diff --git a/packages/cli/src/scaling/__tests__/worker-server.test.ts b/packages/cli/src/scaling/__tests__/worker-server.test.ts index 94b7c01bed..5855a2fe1a 100644 --- a/packages/cli/src/scaling/__tests__/worker-server.test.ts +++ b/packages/cli/src/scaling/__tests__/worker-server.test.ts @@ -1,12 +1,12 @@ import { mockLogger } from '@n8n/backend-test-utils'; import type { GlobalConfig } from '@n8n/config'; +import type { DbConnection } from '@n8n/db'; import type express from 'express'; import { mock } from 'jest-mock-extended'; import type { InstanceSettings } from 'n8n-core'; import { AssertionError } from 'node:assert'; import * as http from 'node:http'; -import type { DbConnection } from '@/databases/db-connection'; import type { ExternalHooks } from '@/external-hooks'; import type { PrometheusMetricsService } from '@/metrics/prometheus-metrics.service'; import { bodyParser, rawBodyReader } from '@/middlewares'; diff --git a/packages/cli/src/scaling/multi-main-setup.ee.ts b/packages/cli/src/scaling/multi-main-setup.ee.ts index 49a7a22bad..d0d5e45c8d 100644 --- a/packages/cli/src/scaling/multi-main-setup.ee.ts +++ b/packages/cli/src/scaling/multi-main-setup.ee.ts @@ -1,11 +1,11 @@ import { Logger } from '@n8n/backend-common'; import { GlobalConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import { MultiMainMetadata } from '@n8n/decorators'; import { Container, Service } from '@n8n/di'; import { InstanceSettings } from 'n8n-core'; import config from '@/config'; -import { Time } from '@/constants'; import { Publisher } from '@/scaling/pubsub/publisher.service'; import { RedisClientService } from '@/services/redis-client.service'; import { TypedEmitter } from '@/typed-emitter'; diff --git a/packages/cli/src/scaling/scaling.service.ts b/packages/cli/src/scaling/scaling.service.ts index 915fbea143..60331e42f2 100644 --- a/packages/cli/src/scaling/scaling.service.ts +++ b/packages/cli/src/scaling/scaling.service.ts @@ -1,5 +1,6 @@ import { isObjectLiteral, Logger } from '@n8n/backend-common'; import { GlobalConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import { ExecutionRepository } from '@n8n/db'; import { OnLeaderStepdown, OnLeaderTakeover, OnShutdown } from '@n8n/decorators'; import { Container, Service } from '@n8n/di'; @@ -17,7 +18,7 @@ import assert, { strict } from 'node:assert'; import { ActiveExecutions } from '@/active-executions'; import config from '@/config'; -import { HIGHEST_SHUTDOWN_PRIORITY, Time } from '@/constants'; +import { HIGHEST_SHUTDOWN_PRIORITY } from '@/constants'; import { EventService } from '@/events/event.service'; import { assertNever } from '@/utils'; diff --git a/packages/cli/src/scaling/worker-server.ts b/packages/cli/src/scaling/worker-server.ts index 19416efa62..82b72d1ab7 100644 --- a/packages/cli/src/scaling/worker-server.ts +++ b/packages/cli/src/scaling/worker-server.ts @@ -1,5 +1,6 @@ import { Logger } from '@n8n/backend-common'; import { GlobalConfig } from '@n8n/config'; +import { DbConnection } from '@n8n/db'; import { Service } from '@n8n/di'; import type { Application } from 'express'; import express from 'express'; @@ -9,7 +10,6 @@ import http from 'node:http'; import type { Server } from 'node:http'; import { CredentialsOverwrites } from '@/credentials-overwrites'; -import { DbConnection } from '@/databases/db-connection'; import { CredentialsOverwritesAlreadySetError } from '@/errors/credentials-overwrites-already-set.error'; import { NonJsonBodyError } from '@/errors/non-json-body.error'; import { ExternalHooks } from '@/external-hooks'; diff --git a/packages/cli/src/server.ts b/packages/cli/src/server.ts index 95dee5870b..020c29423b 100644 --- a/packages/cli/src/server.ts +++ b/packages/cli/src/server.ts @@ -1,5 +1,6 @@ import { inDevelopment, inProduction, LicenseState } from '@n8n/backend-common'; import { SecurityConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import { Container, Service } from '@n8n/di'; import cookieParser from 'cookie-parser'; import express from 'express'; @@ -12,7 +13,7 @@ import { resolve } from 'path'; import { AbstractServer } from '@/abstract-server'; import config from '@/config'; -import { CLI_DIR, EDITOR_UI_DIST_DIR, inE2ETests, N8N_VERSION, Time } from '@/constants'; +import { CLI_DIR, EDITOR_UI_DIST_DIR, inE2ETests, N8N_VERSION } from '@/constants'; import { ControllerRegistry } from '@/controller.registry'; import { CredentialsOverwrites } from '@/credentials-overwrites'; import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus'; diff --git a/packages/cli/src/services/cache/cache.service.ts b/packages/cli/src/services/cache/cache.service.ts index 16721e7e4f..befbcceae5 100644 --- a/packages/cli/src/services/cache/cache.service.ts +++ b/packages/cli/src/services/cache/cache.service.ts @@ -1,10 +1,10 @@ import { GlobalConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import { Container, Service } from '@n8n/di'; import { caching } from 'cache-manager'; import { jsonStringify, UserError } from 'n8n-workflow'; import config from '@/config'; -import { Time } from '@/constants'; import { MalformedRefreshValueError } from '@/errors/cache-errors/malformed-refresh-value.error'; import { UncacheableValueError } from '@/errors/cache-errors/uncacheable-value.error'; import type { diff --git a/packages/cli/src/services/pruning/__tests__/executions-pruning.service.test.ts b/packages/cli/src/services/pruning/__tests__/executions-pruning.service.test.ts index 4efca2c871..8fed6e5ee9 100644 --- a/packages/cli/src/services/pruning/__tests__/executions-pruning.service.test.ts +++ b/packages/cli/src/services/pruning/__tests__/executions-pruning.service.test.ts @@ -1,10 +1,9 @@ import { mockLogger } from '@n8n/backend-test-utils'; import type { ExecutionsConfig } from '@n8n/config'; +import type { DbConnection } from '@n8n/db'; import { mock } from 'jest-mock-extended'; import type { InstanceSettings } from 'n8n-core'; -import type { DbConnection } from '@/databases/db-connection'; - import { ExecutionsPruningService } from '../executions-pruning.service'; describe('PruningService', () => { diff --git a/packages/cli/src/services/pruning/executions-pruning.service.ts b/packages/cli/src/services/pruning/executions-pruning.service.ts index d8e3ebe0a0..75f64987b2 100644 --- a/packages/cli/src/services/pruning/executions-pruning.service.ts +++ b/packages/cli/src/services/pruning/executions-pruning.service.ts @@ -1,15 +1,13 @@ import { Logger } from '@n8n/backend-common'; import { ExecutionsConfig } from '@n8n/config'; -import { ExecutionRepository } from '@n8n/db'; +import { Time } from '@n8n/constants'; +import { ExecutionRepository, DbConnection } from '@n8n/db'; import { OnLeaderStepdown, OnLeaderTakeover, OnShutdown } from '@n8n/decorators'; import { Service } from '@n8n/di'; import { BinaryDataService, InstanceSettings } from 'n8n-core'; import { ensureError } from 'n8n-workflow'; import { strict } from 'node:assert'; -import { Time } from '@/constants'; -import { DbConnection } from '@/databases/db-connection'; - /** * Responsible for deleting old executions from the database and deleting their * associated binary data from the filesystem, on a rolling basis. diff --git a/packages/cli/src/task-runners/task-broker/__tests__/task-broker-ws-server.test.ts b/packages/cli/src/task-runners/task-broker/__tests__/task-broker-ws-server.test.ts index 2a4dc85b42..bdaf6cf401 100644 --- a/packages/cli/src/task-runners/task-broker/__tests__/task-broker-ws-server.test.ts +++ b/packages/cli/src/task-runners/task-broker/__tests__/task-broker-ws-server.test.ts @@ -1,8 +1,9 @@ import type { TaskRunnersConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import { mock } from 'jest-mock-extended'; import type WebSocket from 'ws'; -import { Time, WsStatusCodes } from '@/constants'; +import { WsStatusCodes } from '@/constants'; import { TaskBrokerWsServer } from '@/task-runners/task-broker/task-broker-ws-server'; describe('TaskBrokerWsServer', () => { diff --git a/packages/cli/src/task-runners/task-broker/__tests__/task-broker.service.test.ts b/packages/cli/src/task-runners/task-broker/__tests__/task-broker.service.test.ts index a480a774ad..885d74a0c3 100644 --- a/packages/cli/src/task-runners/task-broker/__tests__/task-broker.service.test.ts +++ b/packages/cli/src/task-runners/task-broker/__tests__/task-broker.service.test.ts @@ -1,10 +1,10 @@ import type { Logger } from '@n8n/backend-common'; import type { TaskRunnersConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import type { RunnerMessage, TaskResultData } from '@n8n/task-runner'; import { mock } from 'jest-mock-extended'; import { ApplicationError, type INodeTypeBaseDescription } from 'n8n-workflow'; -import { Time } from '@/constants'; import type { TaskRunnerLifecycleEvents } from '@/task-runners/task-runner-lifecycle-events'; import { TaskRejectError } from '../errors/task-reject.error'; diff --git a/packages/cli/src/task-runners/task-broker/auth/task-broker-auth.service.ts b/packages/cli/src/task-runners/task-broker/auth/task-broker-auth.service.ts index 1c401afed5..29714219c5 100644 --- a/packages/cli/src/task-runners/task-broker/auth/task-broker-auth.service.ts +++ b/packages/cli/src/task-runners/task-broker/auth/task-broker-auth.service.ts @@ -1,8 +1,8 @@ import { GlobalConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import { Service } from '@n8n/di'; import { randomBytes, timingSafeEqual } from 'crypto'; -import { Time } from '@/constants'; import { CacheService } from '@/services/cache/cache.service'; const GRANT_TOKEN_TTL = 15 * Time.seconds.toMilliseconds; diff --git a/packages/cli/src/task-runners/task-broker/task-broker-ws-server.ts b/packages/cli/src/task-runners/task-broker/task-broker-ws-server.ts index a7b05e67e5..76b2488049 100644 --- a/packages/cli/src/task-runners/task-broker/task-broker-ws-server.ts +++ b/packages/cli/src/task-runners/task-broker/task-broker-ws-server.ts @@ -1,11 +1,12 @@ import { Logger } from '@n8n/backend-common'; import { TaskRunnersConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import { Service } from '@n8n/di'; import type { BrokerMessage, RunnerMessage } from '@n8n/task-runner'; import { jsonStringify, UserError } from 'n8n-workflow'; import type WebSocket from 'ws'; -import { Time, WsStatusCodes } from '@/constants'; +import { WsStatusCodes } from '@/constants'; import { DefaultTaskRunnerDisconnectAnalyzer } from '@/task-runners/default-task-runner-disconnect-analyzer'; import type { DisconnectAnalyzer, diff --git a/packages/cli/src/task-runners/task-broker/task-broker.service.ts b/packages/cli/src/task-runners/task-broker/task-broker.service.ts index cf4d9cad9b..042d4fb8f1 100644 --- a/packages/cli/src/task-runners/task-broker/task-broker.service.ts +++ b/packages/cli/src/task-runners/task-broker/task-broker.service.ts @@ -1,5 +1,6 @@ import { Logger } from '@n8n/backend-common'; import { GlobalConfig, TaskRunnersConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import { Service } from '@n8n/di'; import type { BrokerMessage, @@ -10,7 +11,6 @@ import type { import { UnexpectedError, UserError } from 'n8n-workflow'; import { nanoid } from 'nanoid'; -import { Time } from '@/constants'; import { TaskDeferredError } from '@/task-runners/task-broker/errors/task-deferred.error'; import { TaskRejectError } from '@/task-runners/task-broker/errors/task-reject.error'; import { TaskRunnerAcceptTimeoutError } from '@/task-runners/task-broker/errors/task-runner-accept-timeout.error'; diff --git a/packages/cli/src/task-runners/task-runner-process-restart-loop-detector.ts b/packages/cli/src/task-runners/task-runner-process-restart-loop-detector.ts index f816c97c00..23a0ba79b5 100644 --- a/packages/cli/src/task-runners/task-runner-process-restart-loop-detector.ts +++ b/packages/cli/src/task-runners/task-runner-process-restart-loop-detector.ts @@ -1,4 +1,5 @@ -import { Time } from '@/constants'; +import { Time } from '@n8n/constants'; + import { TaskRunnerRestartLoopError } from '@/task-runners/errors/task-runner-restart-loop-error'; import type { TaskRunnerProcess } from '@/task-runners/task-runner-process'; import { TypedEmitter } from '@/typed-emitter'; diff --git a/packages/cli/src/workflows/workflow-history.ee/workflow-history-manager.ee.ts b/packages/cli/src/workflows/workflow-history.ee/workflow-history-manager.ee.ts index 1e9bce8f98..a958190419 100644 --- a/packages/cli/src/workflows/workflow-history.ee/workflow-history-manager.ee.ts +++ b/packages/cli/src/workflows/workflow-history.ee/workflow-history-manager.ee.ts @@ -1,9 +1,8 @@ +import { Time } from '@n8n/constants'; import { WorkflowHistoryRepository } from '@n8n/db'; import { Service } from '@n8n/di'; import { DateTime } from 'luxon'; -import { Time } from '@/constants'; - import { getWorkflowHistoryPruneTime, isWorkflowHistoryEnabled, diff --git a/packages/cli/test/integration/executions-pruning.service.test.ts b/packages/cli/test/integration/executions-pruning.service.test.ts index 08526f6529..60a1f2e709 100644 --- a/packages/cli/test/integration/executions-pruning.service.test.ts +++ b/packages/cli/test/integration/executions-pruning.service.test.ts @@ -1,13 +1,13 @@ import { mockLogger } from '@n8n/backend-test-utils'; import { ExecutionsConfig } from '@n8n/config'; +import { Time } from '@n8n/constants'; import type { ExecutionEntity } from '@n8n/db'; import { ExecutionRepository } from '@n8n/db'; +import { DbConnection } from '@n8n/db'; import { Container } from '@n8n/di'; import { BinaryDataService, InstanceSettings } from 'n8n-core'; import type { ExecutionStatus, IWorkflowBase } from 'n8n-workflow'; -import { Time } from '@/constants'; -import { DbConnection } from '@/databases/db-connection'; import { ExecutionsPruningService } from '@/services/pruning/executions-pruning.service'; import { diff --git a/packages/cli/test/integration/shared/db/workflow-statistics.ts b/packages/cli/test/integration/shared/db/workflow-statistics.ts index 6f4f9520a1..d1cd64dcee 100644 --- a/packages/cli/test/integration/shared/db/workflow-statistics.ts +++ b/packages/cli/test/integration/shared/db/workflow-statistics.ts @@ -15,6 +15,7 @@ export async function createWorkflowStatisticsItem( workflowId, }); + // @ts-ignore CAT-957 await Container.get(WorkflowStatisticsRepository).insert(entity); return entity; diff --git a/packages/cli/test/integration/shared/test-db.ts b/packages/cli/test/integration/shared/test-db.ts index 4845a475ff..7133931287 100644 --- a/packages/cli/test/integration/shared/test-db.ts +++ b/packages/cli/test/integration/shared/test-db.ts @@ -1,13 +1,12 @@ import { GlobalConfig } from '@n8n/config'; import type { entities } from '@n8n/db'; +import { DbConnection } from '@n8n/db'; +import { DbConnectionOptions } from '@n8n/db'; import { Container } from '@n8n/di'; import type { DataSourceOptions } from '@n8n/typeorm'; import { DataSource as Connection } from '@n8n/typeorm'; import { randomString } from 'n8n-workflow'; -import { DbConnection } from '@/databases/db-connection'; -import { DbConnectionOptions } from '@/databases/db-connection-options'; - export const testDbPrefix = 'n8n_test_'; /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 282ee29272..542b3e56a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -554,6 +554,9 @@ importers: '@n8n/constants': specifier: workspace:^ version: link:../constants + '@n8n/decorators': + specifier: workspace:^ + version: link:../decorators '@n8n/di': specifier: workspace:^ version: link:../di