Skip to content

Commit ade546f

Browse files
authored
refactor(core): Move first batch of repositories to @n8n/db (#15130)
1 parent 939ff97 commit ade546f

File tree

151 files changed

+338
-299
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

151 files changed

+338
-299
lines changed

packages/@n8n/db/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@
2626
"@n8n/permissions": "workspace:^",
2727
"@n8n/typeorm": "catalog:",
2828
"class-validator": "0.14.0",
29+
"flatted": "catalog:",
30+
"lodash": "catalog:",
2931
"n8n-core": "workspace:^",
3032
"n8n-workflow": "workspace:^",
3133
"nanoid": "catalog:",
3234
"reflect-metadata": "catalog:",
3335
"xss": "catalog:"
3436
},
3537
"devDependencies": {
36-
"@n8n/typescript-config": "workspace:*"
38+
"@n8n/typescript-config": "workspace:*",
39+
"@types/lodash": "catalog:"
3740
}
3841
}

packages/@n8n/db/src/entities/types-db.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { GlobalRole, Scope } from '@n8n/permissions';
2+
import type { FindOperator } from '@n8n/typeorm';
23
import type {
34
ICredentialsEncrypted,
45
IRunExecutionData,
@@ -308,3 +309,45 @@ export type MockedNodeItem = {
308309
export type RunningMode = 'dry' | 'live';
309310

310311
export type SyncStatus = 'success' | 'error';
312+
313+
/** @deprecated This is tech debt. Do not rely on request-level types in repositories. */
314+
export namespace ListQuery {
315+
export type Options = {
316+
filter?: Record<string, unknown>;
317+
select?: Record<string, true>;
318+
skip?: number;
319+
take?: number;
320+
sortBy?: string;
321+
};
322+
}
323+
324+
export type ProjectRole =
325+
| 'project:personalOwner'
326+
| 'project:admin'
327+
| 'project:editor'
328+
| 'project:viewer';
329+
330+
export interface IGetExecutionsQueryFilter {
331+
id?: FindOperator<string> | string;
332+
finished?: boolean;
333+
mode?: string;
334+
retryOf?: string;
335+
retrySuccessId?: string;
336+
status?: ExecutionStatus[];
337+
workflowId?: string;
338+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
339+
waitTill?: FindOperator<any> | boolean;
340+
metadata?: Array<{ key: string; value: string }>;
341+
startedAfter?: string;
342+
startedBefore?: string;
343+
}
344+
345+
export type ResourceType = 'folder' | 'workflow';
346+
347+
export type WorkflowFolderUnionFull = (
348+
| ListQueryDb.Workflow.Plain
349+
| ListQueryDb.Workflow.WithSharing
350+
| FolderWithWorkflowAndSubFolderCount
351+
) & {
352+
resource: ResourceType;
353+
};

packages/@n8n/db/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ export * from './entities';
1818
export * from './entities/types-db';
1919
export { NoXss } from './utils/validators/no-xss.validator';
2020
export { NoUrl } from './utils/validators/no-url.validator';
21+
22+
export * from './repositories';

packages/cli/src/databases/repositories/annotation-tag-mapping.repository.ee.ts renamed to packages/@n8n/db/src/repositories/annotation-tag-mapping.repository.ee.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { AnnotationTagMapping } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, Repository } from '@n8n/typeorm';
43

4+
import { AnnotationTagMapping } from '../entities';
5+
56
@Service()
67
export class AnnotationTagMappingRepository extends Repository<AnnotationTagMapping> {
78
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/annotation-tag.repository.ee.ts renamed to packages/@n8n/db/src/repositories/annotation-tag.repository.ee.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { AnnotationTagEntity } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, Repository } from '@n8n/typeorm';
43

4+
import { AnnotationTagEntity } from '../entities';
5+
56
@Service()
67
export class AnnotationTagRepository extends Repository<AnnotationTagEntity> {
78
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/api-key.repository.ts renamed to packages/@n8n/db/src/repositories/api-key.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { ApiKey } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, Repository } from '@n8n/typeorm';
43

4+
import { ApiKey } from '../entities';
5+
56
@Service()
67
export class ApiKeyRepository extends Repository<ApiKey> {
78
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/auth-identity.repository.ts renamed to packages/@n8n/db/src/repositories/auth-identity.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { AuthIdentity } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, Repository } from '@n8n/typeorm';
43

4+
import { AuthIdentity } from '../entities';
5+
56
@Service()
67
export class AuthIdentityRepository extends Repository<AuthIdentity> {
78
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/auth-provider-sync-history.repository.ts renamed to packages/@n8n/db/src/repositories/auth-provider-sync-history.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { AuthProviderSyncHistory } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, Repository } from '@n8n/typeorm';
43

4+
import { AuthProviderSyncHistory } from '../entities';
5+
56
@Service()
67
export class AuthProviderSyncHistoryRepository extends Repository<AuthProviderSyncHistory> {
78
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/auth-user.repository.ts renamed to packages/@n8n/db/src/repositories/auth-user.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { AuthUser } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, Repository } from '@n8n/typeorm';
43

4+
import { AuthUser } from '../entities';
5+
56
@Service()
67
export class AuthUserRepository extends Repository<AuthUser> {
78
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/credentials.repository.ts renamed to packages/@n8n/db/src/repositories/credentials.repository.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import type { User } from '@n8n/db';
2-
import { CredentialsEntity } from '@n8n/db';
31
import { Service } from '@n8n/di';
42
import { DataSource, In, Repository, Like } from '@n8n/typeorm';
53
import type { FindManyOptions } from '@n8n/typeorm';
64

7-
import type { ListQuery } from '@/requests';
5+
import { CredentialsEntity } from '../entities';
6+
import type { User } from '../entities';
7+
import type { ListQuery } from '../entities/types-db';
88

99
@Service()
1010
export class CredentialsRepository extends Repository<CredentialsEntity> {

packages/cli/src/databases/repositories/event-destinations.repository.ts renamed to packages/@n8n/db/src/repositories/event-destinations.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { EventDestinations } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, Repository } from '@n8n/typeorm';
43

4+
import { EventDestinations } from '../entities';
5+
56
@Service()
67
export class EventDestinationsRepository extends Repository<EventDestinations> {
78
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/execution-annotation.repository.ts renamed to packages/@n8n/db/src/repositories/execution-annotation.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { ExecutionAnnotation } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, Repository } from '@n8n/typeorm';
43

4+
import { ExecutionAnnotation } from '../entities';
5+
56
@Service()
67
export class ExecutionAnnotationRepository extends Repository<ExecutionAnnotation> {
78
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/execution-data.repository.ts renamed to packages/@n8n/db/src/repositories/execution-data.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { ExecutionData } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, In, Repository } from '@n8n/typeorm';
43
import type { EntityManager } from '@n8n/typeorm';
54
import type { QueryDeepPartialEntity } from '@n8n/typeorm/query-builder/QueryPartialEntity';
65

6+
import { ExecutionData } from '../entities';
7+
78
@Service()
89
export class ExecutionDataRepository extends Repository<ExecutionData> {
910
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/execution-metadata.repository.ts renamed to packages/@n8n/db/src/repositories/execution-metadata.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { ExecutionMetadata } from '@n8n/db';
21
import { Service } from '@n8n/di';
32
import { DataSource, Repository } from '@n8n/typeorm';
43

4+
import { ExecutionMetadata } from '../entities';
5+
56
@Service()
67
export class ExecutionMetadataRepository extends Repository<ExecutionMetadata> {
78
constructor(dataSource: DataSource) {

packages/cli/src/databases/repositories/execution.repository.ts renamed to packages/@n8n/db/src/repositories/execution.repository.ts

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,4 @@
11
import { GlobalConfig } from '@n8n/config';
2-
import type {
3-
CreateExecutionPayload,
4-
IExecutionFlattedDb,
5-
IExecutionBase,
6-
IExecutionResponse,
7-
ExecutionSummaries,
8-
} from '@n8n/db';
9-
import {
10-
separate,
11-
SharedWorkflow,
12-
WorkflowEntity,
13-
AnnotationTagEntity,
14-
AnnotationTagMapping,
15-
ExecutionData,
16-
ExecutionEntity,
17-
ExecutionAnnotation,
18-
ExecutionMetadata,
19-
} from '@n8n/db';
202
import { Service } from '@n8n/di';
213
import type {
224
FindManyOptions,
@@ -49,9 +31,31 @@ import type {
4931
IRunExecutionData,
5032
} from 'n8n-workflow';
5133

52-
import { PostgresLiveRowsRetrievalError } from '@/errors/postgres-live-rows-retrieval.error';
53-
5434
import { ExecutionDataRepository } from './execution-data.repository';
35+
import {
36+
ExecutionEntity,
37+
ExecutionMetadata,
38+
ExecutionData,
39+
ExecutionAnnotation,
40+
AnnotationTagMapping,
41+
WorkflowEntity,
42+
SharedWorkflow,
43+
AnnotationTagEntity,
44+
} from '../entities';
45+
import type {
46+
CreateExecutionPayload,
47+
IExecutionFlattedDb,
48+
IExecutionBase,
49+
IExecutionResponse,
50+
ExecutionSummaries,
51+
} from '../entities/types-db';
52+
import { separate } from '../utils/separate';
53+
54+
class PostgresLiveRowsRetrievalError extends UnexpectedError {
55+
constructor(rows: unknown) {
56+
super('Failed to retrieve live execution rows in Postgres', { extra: { rows } });
57+
}
58+
}
5559

5660
export interface IGetExecutionsQueryFilter {
5761
id?: FindOperator<string> | string;
@@ -61,6 +65,7 @@ export interface IGetExecutionsQueryFilter {
6165
retrySuccessId?: string;
6266
status?: ExecutionStatus[];
6367
workflowId?: string;
68+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
6469
waitTill?: FindOperator<any> | boolean;
6570
metadata?: Array<{ key: string; value: string }>;
6671
startedAfter?: string;
@@ -989,6 +994,7 @@ export class ExecutionRepository extends Repository<ExecutionEntity> {
989994
qb.setParameter('value', value);
990995
}
991996

997+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
992998
if (annotationTags?.length || vote) {
993999
// If there is a filter by one or multiple tags or by vote - we need to join the annotations table
9941000
qb.innerJoin('execution.annotation', 'annotation');
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export { AnnotationTagMappingRepository } from './annotation-tag-mapping.repository.ee';
2+
export { AnnotationTagRepository } from './annotation-tag.repository.ee';
3+
export { ApiKeyRepository } from './api-key.repository';
4+
export { AuthIdentityRepository } from './auth-identity.repository';
5+
export { AuthProviderSyncHistoryRepository } from './auth-provider-sync-history.repository';
6+
export { AuthUserRepository } from './auth-user.repository';
7+
export { CredentialsRepository } from './credentials.repository';
8+
export { ExecutionAnnotationRepository } from './execution-annotation.repository';
9+
export { ExecutionDataRepository } from './execution-data.repository';
10+
export { ExecutionMetadataRepository } from './execution-metadata.repository';
11+
export { ExecutionRepository } from './execution.repository';
12+
export { EventDestinationsRepository } from './event-destinations.repository';

packages/cli/src/__tests__/active-executions.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { ExecutionRepository } from '@n8n/db';
12
import { captor, mock } from 'jest-mock-extended';
23
import type {
34
IDeferredPromise,
@@ -12,7 +13,6 @@ import { v4 as uuid } from 'uuid';
1213
import { ActiveExecutions } from '@/active-executions';
1314
import { ConcurrencyControlService } from '@/concurrency/concurrency-control.service';
1415
import config from '@/config';
15-
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
1616
import { mockInstance } from '@test/mocking';
1717

1818
jest.mock('n8n-workflow', () => ({

packages/cli/src/__tests__/external-hooks.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import type { GlobalConfig } from '@n8n/config';
2+
import type { CredentialsRepository } from '@n8n/db';
23
import { mock } from 'jest-mock-extended';
34
import type { ErrorReporter, Logger } from 'n8n-core';
45
import type { IWorkflowBase } from 'n8n-workflow';
56
import { UnexpectedError } from 'n8n-workflow';
67

7-
import type { CredentialsRepository } from '@/databases/repositories/credentials.repository';
88
import type { SettingsRepository } from '@/databases/repositories/settings.repository';
99
import type { UserRepository } from '@/databases/repositories/user.repository';
1010
import type { WorkflowRepository } from '@/databases/repositories/workflow.repository';

packages/cli/src/__tests__/wait-tracker.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import type { Project } from '@n8n/db';
22
import type { IExecutionResponse } from '@n8n/db';
3+
import type { ExecutionRepository } from '@n8n/db';
34
import { mock } from 'jest-mock-extended';
45
import type { InstanceSettings } from 'n8n-core';
56
import type { IRun, IWorkflowBase } from 'n8n-workflow';
67
import { createDeferredPromise } from 'n8n-workflow';
78

89
import type { ActiveExecutions } from '@/active-executions';
9-
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
1010
import type { MultiMainSetup } from '@/scaling/multi-main-setup.ee';
1111
import type { OwnershipService } from '@/services/ownership.service';
1212
import { WaitTracker } from '@/wait-tracker';

packages/cli/src/__tests__/workflow-execute-additional-data.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { GlobalConfig } from '@n8n/config';
22
import type { WorkflowEntity } from '@n8n/db';
3+
import { ExecutionRepository } from '@n8n/db';
34
import { Container } from '@n8n/di';
45
import { mock } from 'jest-mock-extended';
56
import type { IWorkflowBase } from 'n8n-workflow';
@@ -14,7 +15,6 @@ import type PCancelable from 'p-cancelable';
1415

1516
import { ActiveExecutions } from '@/active-executions';
1617
import { CredentialsHelper } from '@/credentials-helper';
17-
import { ExecutionRepository } from '@/databases/repositories/execution.repository';
1818
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
1919
import { VariablesService } from '@/environments.ee/variables/variables.service.ee';
2020
import { EventService } from '@/events/event.service';

packages/cli/src/__tests__/workflow-runner.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ afterAll(() => {
5151
});
5252

5353
beforeEach(async () => {
54-
await testDb.truncate(['Workflow', 'SharedWorkflow']);
54+
await testDb.truncate(['WorkflowEntity', 'SharedWorkflow']);
5555
jest.clearAllMocks();
5656
});
5757

packages/cli/src/active-executions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { CreateExecutionPayload, IExecutionDb } from '@n8n/db';
2+
import { ExecutionRepository } from '@n8n/db';
23
import { Service } from '@n8n/di';
34
import { Logger } from 'n8n-core';
45
import type {
@@ -12,7 +13,6 @@ import { createDeferredPromise, ExecutionCancelledError, sleep } from 'n8n-workf
1213
import { strict as assert } from 'node:assert';
1314
import type PCancelable from 'p-cancelable';
1415

15-
import { ExecutionRepository } from '@/databases/repositories/execution.repository';
1616
import { ExecutionNotFoundError } from '@/errors/execution-not-found-error';
1717
import type { IExecutingWorkflowData, IExecutionsCurrentSummary } from '@/interfaces';
1818
import { isWorkflowIdValid } from '@/utils';

packages/cli/src/commands/community-node.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { type InstalledNodes, type InstalledPackages, type User } from '@n8n/db';
2+
import { CredentialsRepository } from '@n8n/db';
23
import { Container } from '@n8n/di';
34
import { Flags } from '@oclif/core';
45

56
import { CredentialsService } from '@/credentials/credentials.service';
6-
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
77
import { InstalledNodesRepository } from '@/databases/repositories/installed-nodes.repository';
88
import { UserRepository } from '@/databases/repositories/user.repository';
99
import { CommunityPackagesService } from '@/services/community-packages.service';

packages/cli/src/commands/export/credentials.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import type { ICredentialsDb } from '@n8n/db';
2+
import { CredentialsRepository } from '@n8n/db';
23
import { Container } from '@n8n/di';
34
import { Flags } from '@oclif/core';
45
import fs from 'fs';
56
import { Credentials } from 'n8n-core';
67
import { UserError } from 'n8n-workflow';
78
import path from 'path';
89

9-
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
1010
import type { ICredentialsDecryptedDb } from '@/interfaces';
1111

1212
import { BaseCommand } from '../base-command';

packages/cli/src/commands/ldap/reset.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { AuthIdentityRepository, AuthProviderSyncHistoryRepository } from '@n8n/db';
12
import { Container } from '@n8n/di';
23
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
34
import { In } from '@n8n/typeorm';
@@ -6,8 +7,6 @@ import { UserError } from 'n8n-workflow';
67

78
import { UM_FIX_INSTRUCTION } from '@/constants';
89
import { CredentialsService } from '@/credentials/credentials.service';
9-
import { AuthIdentityRepository } from '@/databases/repositories/auth-identity.repository';
10-
import { AuthProviderSyncHistoryRepository } from '@/databases/repositories/auth-provider-sync-history.repository';
1110
import { ProjectRelationRepository } from '@/databases/repositories/project-relation.repository';
1211
import { ProjectRepository } from '@/databases/repositories/project.repository';
1312
import { SettingsRepository } from '@/databases/repositories/settings.repository';

0 commit comments

Comments
 (0)