refactor(core): Move third batch of repositories to @n8n/db (#15166)

This commit is contained in:
Iván Ovejero
2025-05-09 09:57:54 +02:00
committed by GitHub
parent 3079059e96
commit f2ee990a57
58 changed files with 155 additions and 139 deletions

View File

@@ -19,3 +19,12 @@ export { LicenseMetricsRepository } from './license-metrics.repository';
export { ProjectRelationRepository } from './project-relation.repository';
export { ProjectRepository } from './project.repository';
export { ProcessedDataRepository } from './processed-data.repository';
export { TagRepository } from './tag.repository';
export { TestCaseExecutionRepository } from './test-case-execution.repository.ee';
export { TestDefinitionRepository } from './test-definition.repository.ee';
export { TestMetricRepository } from './test-metric.repository.ee';
export { TestRunRepository } from './test-run.repository.ee';
export { VariablesRepository } from './variables.repository';
export { WorkflowHistoryRepository } from './workflow-history.repository';
export { WorkflowStatisticsRepository } from './workflow-statistics.repository';
export { WorkflowTagMappingRepository } from './workflow-tag-mapping.repository';

View File

@@ -1,10 +1,11 @@
import type { IWorkflowDb } from '@n8n/db';
import { TagEntity } from '@n8n/db';
import { Service } from '@n8n/di';
import type { EntityManager } from '@n8n/typeorm';
import { DataSource, In, Repository } from '@n8n/typeorm';
import intersection from 'lodash/intersection';
import { TagEntity } from '../entities';
import type { IWorkflowDb } from '../entities/types-db';
@Service()
export class TagRepository extends Repository<TagEntity> {
constructor(dataSource: DataSource) {

View File

@@ -1,11 +1,12 @@
import { TestCaseExecution } from '@n8n/db';
import type { TestCaseExecutionErrorCode } from '@n8n/db';
import { Service } from '@n8n/di';
import type { EntityManager } from '@n8n/typeorm';
import { DataSource, In, Not, Repository } from '@n8n/typeorm';
import type { DeepPartial } from '@n8n/typeorm/common/DeepPartial';
import type { IDataObject } from 'n8n-workflow';
import { TestCaseExecution } from '../entities';
import type { TestCaseExecutionErrorCode } from '../entities/types-db';
type StatusUpdateOptions = {
testRunId: string;
pastExecutionId: string;

View File

@@ -1,10 +1,10 @@
import { TestDefinition } from '@n8n/db';
import { Service } from '@n8n/di';
import type { FindManyOptions, FindOptionsWhere } from '@n8n/typeorm';
import { DataSource, In, Repository } from '@n8n/typeorm';
import { UserError } from 'n8n-workflow';
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
import type { ListQuery } from '@/requests';
import { TestDefinition } from '../entities';
import type { ListQuery } from '../entities/types-db';
@Service()
export class TestDefinitionRepository extends Repository<TestDefinition> {
@@ -19,7 +19,7 @@ export class TestDefinitionRepository extends Repository<TestDefinition> {
if (options?.filter?.workflowId) {
if (!accessibleWorkflowIds.includes(options.filter.workflowId as string)) {
throw new ForbiddenError('User does not have access to the workflow');
throw new UserError('User does not have access to the workflow');
}
where.workflow = {

View File

@@ -1,7 +1,8 @@
import { TestMetric } from '@n8n/db';
import { Service } from '@n8n/di';
import { DataSource, Repository } from '@n8n/typeorm';
import { TestMetric } from '../entities';
@Service()
export class TestMetricRepository extends Repository<TestMetric> {
constructor(dataSource: DataSource) {

View File

@@ -1,13 +1,16 @@
import type { AggregatedTestRunMetrics, TestRunErrorCode, TestRunFinalResult } from '@n8n/db';
import { TestRun } from '@n8n/db';
import { Service } from '@n8n/di';
import type { EntityManager, FindManyOptions } from '@n8n/typeorm';
import { DataSource, In, Repository } from '@n8n/typeorm';
import type { IDataObject } from 'n8n-workflow';
import { UnexpectedError, type IDataObject } from 'n8n-workflow';
import { NotFoundError } from '@/errors/response-errors/not-found.error';
import { getTestRunFinalResult } from '@/evaluation.ee/test-runner/utils.ee';
import type { ListQuery } from '@/requests';
import { TestRun } from '../entities';
import type {
AggregatedTestRunMetrics,
TestRunErrorCode,
TestRunFinalResult,
ListQuery,
} from '../entities/types-db';
import { getTestRunFinalResult } from '../utils/get-final-test-result';
export type TestRunSummary = TestRun & {
finalResult: TestRunFinalResult | null;
@@ -110,7 +113,7 @@ export class TestRunRepository extends Repository<TestRun> {
});
if (!testRun) {
throw new NotFoundError('Test run not found');
throw new UnexpectedError('Test run not found');
}
testRun.finalResult =

View File

@@ -1,7 +1,8 @@
import { Variables } from '@n8n/db';
import { Service } from '@n8n/di';
import { DataSource, Repository } from '@n8n/typeorm';
import { Variables } from '../entities';
@Service()
export class VariablesRepository extends Repository<Variables> {
constructor(dataSource: DataSource) {

View File

@@ -1,7 +1,8 @@
import { WorkflowHistory } from '@n8n/db';
import { Service } from '@n8n/di';
import { DataSource, LessThan, Repository } from '@n8n/typeorm';
import { WorkflowHistory } from '../entities';
@Service()
export class WorkflowHistoryRepository extends Repository<WorkflowHistory> {
constructor(dataSource: DataSource) {

View File

@@ -1,9 +1,11 @@
import { GlobalConfig } from '@n8n/config';
import type { User } from '@n8n/db';
import { StatisticsNames, WorkflowStatistics } from '@n8n/db';
import { Service } from '@n8n/di';
import { DataSource, MoreThanOrEqual, QueryFailedError, Repository } from '@n8n/typeorm';
import { WorkflowStatistics } from '../entities';
import type { User } from '../entities';
import { StatisticsNames } from '../entities/types-db';
type StatisticsInsertResult = 'insert' | 'failed' | 'alreadyExists';
type StatisticsUpsertResult = StatisticsInsertResult | 'update';

View File

@@ -1,7 +1,8 @@
import { WorkflowTagMapping } from '@n8n/db';
import { Service } from '@n8n/di';
import { DataSource, Repository } from '@n8n/typeorm';
import { WorkflowTagMapping } from '../entities';
@Service()
export class WorkflowTagMappingRepository extends Repository<WorkflowTagMapping> {
constructor(dataSource: DataSource) {

View File

@@ -1,7 +1,7 @@
import type { TestCaseExecution } from '@n8n/db';
import { mock } from 'jest-mock-extended';
import { getTestRunFinalResult } from '@/evaluation.ee/test-runner/utils.ee';
import type { TestCaseExecution } from '../../entities';
import { getTestRunFinalResult } from '../get-final-test-result';
function mockTestCaseExecutions(statuses: Array<TestCaseExecution['status']>) {
return statuses.map((status) => mock<TestCaseExecution>({ status }));

View File

@@ -0,0 +1,30 @@
import type { TestCaseExecution } from '../entities';
import type { TestRunFinalResult } from '../entities/types-db';
/**
* Returns the final result of the test run based on the test case executions.
* The final result is the most severe status among all test case executions' statuses.
*/
export function getTestRunFinalResult(testCaseExecutions: TestCaseExecution[]): TestRunFinalResult {
// Priority of statuses: error > warning > success
const severityMap: Record<TestRunFinalResult, number> = {
error: 3,
warning: 2,
success: 1,
};
let finalResult: TestRunFinalResult = 'success';
for (const testCaseExecution of testCaseExecutions) {
if (['error', 'warning'].includes(testCaseExecution.status)) {
if (
testCaseExecution.status in severityMap &&
severityMap[testCaseExecution.status as TestRunFinalResult] > severityMap[finalResult]
) {
finalResult = testCaseExecution.status as TestRunFinalResult;
}
}
}
return finalResult;
}

View File

@@ -1,10 +1,9 @@
import type { WorkflowStatistics } from '@n8n/db';
import { StatisticsNames } from '@n8n/db';
import { StatisticsNames, WorkflowStatisticsRepository } from '@n8n/db';
import { Get, Middleware, RestController } from '@n8n/decorators';
import { Response, NextFunction } from 'express';
import { Logger } from 'n8n-core';
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflow-statistics.repository';
import { NotFoundError } from '@/errors/response-errors/not-found.error';
import type { IWorkflowStatisticsDataLoaded } from '@/interfaces';
import { WorkflowFinderService } from '@/workflows/workflow-finder.service';

View File

@@ -1,9 +1,9 @@
import { StatisticsNames, WorkflowStatistics } from '@n8n/db';
import { WorkflowStatisticsRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { type InsertResult, QueryFailedError } from '@n8n/typeorm';
import { mock, mockClear } from 'jest-mock-extended';
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflow-statistics.repository';
import { mockEntityManager } from '@test/mocking';
import { createWorkflow } from '@test-integration/db/workflows';
import * as testDb from '@test-integration/test-db';

View File

@@ -2,6 +2,8 @@ import type { SourceControlledFile } from '@n8n/api-types';
import type { SharedCredentials } from '@n8n/db';
import type { SharedWorkflow } from '@n8n/db';
import type { FolderRepository } from '@n8n/db';
import type { TagRepository } from '@n8n/db';
import type { WorkflowTagMappingRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { mock, captor } from 'jest-mock-extended';
import { Cipher, type InstanceSettings } from 'n8n-core';
@@ -9,8 +11,6 @@ import fsp from 'node:fs/promises';
import type { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
import type { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import type { TagRepository } from '@/databases/repositories/tag.repository';
import type { WorkflowTagMappingRepository } from '@/databases/repositories/workflow-tag-mapping.repository';
import type { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import type { VariablesService } from '../../variables/variables.service.ee';

View File

@@ -4,11 +4,11 @@ import type { FolderWithWorkflowAndSubFolderCount } from '@n8n/db';
import type { TagEntity } from '@n8n/db';
import type { User } from '@n8n/db';
import type { FolderRepository } from '@n8n/db';
import type { TagRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { mock } from 'jest-mock-extended';
import { InstanceSettings } from 'n8n-core';
import type { TagRepository } from '@/databases/repositories/tag.repository';
import { SourceControlPreferencesService } from '@/environments.ee/source-control/source-control-preferences.service.ee';
import { SourceControlService } from '@/environments.ee/source-control/source-control.service.ee';

View File

@@ -1,6 +1,6 @@
import type { SourceControlledFile } from '@n8n/api-types';
import type { IWorkflowDb } from '@n8n/db';
import { FolderRepository } from '@n8n/db';
import { FolderRepository, TagRepository, WorkflowTagMappingRepository } from '@n8n/db';
import { Service } from '@n8n/di';
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
import { In } from '@n8n/typeorm';
@@ -12,8 +12,6 @@ import path from 'path';
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { WorkflowTagMappingRepository } from '@/databases/repositories/workflow-tag-mapping.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import { formatWorkflow } from '@/workflows/workflow.formatter';

View File

@@ -5,6 +5,9 @@ import {
CredentialsRepository,
FolderRepository,
ProjectRepository,
TagRepository,
VariablesRepository,
WorkflowTagMappingRepository,
} from '@n8n/db';
import { Service } from '@n8n/di';
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
@@ -19,10 +22,7 @@ import { ActiveWorkflowManager } from '@/active-workflow-manager';
import { CredentialsService } from '@/credentials/credentials.service';
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { UserRepository } from '@/databases/repositories/user.repository';
import { VariablesRepository } from '@/databases/repositories/variables.repository';
import { WorkflowTagMappingRepository } from '@/databases/repositories/workflow-tag-mapping.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import type { IWorkflowToImport } from '@/interfaces';
import { isUniqueConstraintError } from '@/response-helper';

View File

@@ -4,7 +4,7 @@ import type {
SourceControlledFile,
} from '@n8n/api-types';
import type { Variables, TagEntity, User } from '@n8n/db';
import { FolderRepository } from '@n8n/db';
import { FolderRepository, TagRepository } from '@n8n/db';
import { Service } from '@n8n/di';
import { writeFileSync } from 'fs';
import { Logger } from 'n8n-core';
@@ -12,7 +12,6 @@ import { UnexpectedError, UserError } from 'n8n-workflow';
import path from 'path';
import type { PushResult } from 'simple-git';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
import { EventService } from '@/events/event.service';

View File

@@ -1,8 +1,7 @@
import { generateNanoId } from '@n8n/db';
import type { Variables } from '@n8n/db';
import { generateNanoId, VariablesRepository } from '@n8n/db';
import { Service } from '@n8n/di';
import { VariablesRepository } from '@/databases/repositories/variables.repository';
import { VariableCountLimitReachedError } from '@/errors/variable-count-limit-reached.error';
import { VariableValidationError } from '@/errors/variable-validation.error';
import { EventService } from '@/events/event.service';

View File

@@ -1,8 +1,7 @@
import type { MockedNodeItem, TestDefinition } from '@n8n/db';
import { AnnotationTagRepository } from '@n8n/db';
import { AnnotationTagRepository, TestDefinitionRepository } from '@n8n/db';
import { Service } from '@n8n/di';
import { TestDefinitionRepository } from '@/databases/repositories/test-definition.repository.ee';
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
import { NotFoundError } from '@/errors/response-errors/not-found.error';
import { validateEntity } from '@/generic-helpers';

View File

@@ -1,5 +1,6 @@
import { Get, Post, Patch, RestController, Delete } from '@n8n/decorators';
import express from 'express';
import { UserError } from 'n8n-workflow';
import assert from 'node:assert';
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
@@ -26,10 +27,15 @@ export class TestDefinitionsController {
async getMany(req: TestDefinitionsRequest.GetMany) {
const userAccessibleWorkflowIds = await getSharedWorkflowIds(req.user, ['workflow:read']);
return await this.testDefinitionService.getMany(
req.listQueryOptions,
userAccessibleWorkflowIds,
);
try {
return await this.testDefinitionService.getMany(
req.listQueryOptions,
userAccessibleWorkflowIds,
);
} catch (error) {
if (error instanceof UserError) throw new ForbiddenError(error.message);
throw error;
}
}
@Get('/:id')

View File

@@ -4,6 +4,9 @@ import type { TestDefinition } from '@n8n/db';
import type { TestMetric } from '@n8n/db';
import type { TestRun } from '@n8n/db';
import type { ExecutionRepository } from '@n8n/db';
import type { TestCaseExecutionRepository } from '@n8n/db';
import type { TestMetricRepository } from '@n8n/db';
import type { TestRunRepository } from '@n8n/db';
import type { SelectQueryBuilder } from '@n8n/typeorm';
import { stringify } from 'flatted';
import { readFileSync } from 'fs';
@@ -15,9 +18,6 @@ import path from 'path';
import type { ActiveExecutions } from '@/active-executions';
import config from '@/config';
import type { TestCaseExecutionRepository } from '@/databases/repositories/test-case-execution.repository.ee';
import type { TestMetricRepository } from '@/databases/repositories/test-metric.repository.ee';
import type { TestRunRepository } from '@/databases/repositories/test-run.repository.ee';
import type { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
import { NodeTypes } from '@/node-types';

View File

@@ -1,5 +1,10 @@
import type { User, ExecutionEntity, MockedNodeItem, TestDefinition, TestRun } from '@n8n/db';
import { ExecutionRepository } from '@n8n/db';
import {
ExecutionRepository,
TestCaseExecutionRepository,
TestMetricRepository,
TestRunRepository,
} from '@n8n/db';
import { Service } from '@n8n/di';
import { parse } from 'flatted';
import difference from 'lodash/difference';
@@ -18,9 +23,6 @@ import assert from 'node:assert';
import { ActiveExecutions } from '@/active-executions';
import config from '@/config';
import { EVALUATION_METRICS_NODE } from '@/constants';
import { TestCaseExecutionRepository } from '@/databases/repositories/test-case-execution.repository.ee';
import { TestMetricRepository } from '@/databases/repositories/test-metric.repository.ee';
import { TestRunRepository } from '@/databases/repositories/test-run.repository.ee';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import * as Db from '@/db';
import { TestCaseExecutionError, TestRunError } from '@/evaluation.ee/test-runner/errors.ee';

View File

@@ -1,4 +1,4 @@
import type { TestCaseExecution, MockedNodeItem, TestRunFinalResult } from '@n8n/db';
import type { MockedNodeItem } from '@n8n/db';
import assert from 'assert';
import { mapValues, pick } from 'lodash';
import type {
@@ -70,34 +70,6 @@ export function getPastExecutionTriggerNode(executionData: IRunExecutionData) {
});
}
/**
* Returns the final result of the test run based on the test case executions.
* The final result is the most severe status among all test case executions' statuses.
*/
export function getTestRunFinalResult(testCaseExecutions: TestCaseExecution[]): TestRunFinalResult {
// Priority of statuses: error > warning > success
const severityMap: Record<TestRunFinalResult, number> = {
error: 3,
warning: 2,
success: 1,
};
let finalResult: TestRunFinalResult = 'success';
for (const testCaseExecution of testCaseExecutions) {
if (['error', 'warning'].includes(testCaseExecution.status)) {
if (
testCaseExecution.status in severityMap &&
severityMap[testCaseExecution.status as TestRunFinalResult] > severityMap[finalResult]
) {
finalResult = testCaseExecution.status as TestRunFinalResult;
}
}
}
return finalResult;
}
/**
* Function to check if the node is root node or sub-node.
* Sub-node is a node which does not have the main output (the only exception is Stop and Error node)

View File

@@ -1,9 +1,9 @@
import { TestCaseExecutionRepository, TestRunRepository } from '@n8n/db';
import { Delete, Get, Post, RestController } from '@n8n/decorators';
import express from 'express';
import { InstanceSettings } from 'n8n-core';
import { UnexpectedError } from 'n8n-workflow';
import { TestCaseExecutionRepository } from '@/databases/repositories/test-case-execution.repository.ee';
import { TestRunRepository } from '@/databases/repositories/test-run.repository.ee';
import { ConflictError } from '@/errors/response-errors/conflict.error';
import { NotFoundError } from '@/errors/response-errors/not-found.error';
import { NotImplementedError } from '@/errors/response-errors/not-implemented.error';
@@ -79,7 +79,12 @@ export class TestRunsController {
await this.getTestDefinition(req);
return await this.testRunRepository.getTestRunSummaryById(testDefinitionId, id);
try {
return await this.testRunRepository.getTestRunSummaryById(testDefinitionId, id);
} catch (error) {
if (error instanceof UnexpectedError) throw new NotFoundError(error.message);
throw error;
}
}
@Get('/:testDefinitionId/runs/:id/cases')

View File

@@ -1,10 +1,10 @@
import type { TagEntity } from '@n8n/db';
import { TagRepository } from '@n8n/db';
import { Container } from '@n8n/di';
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
import type { FindManyOptions } from '@n8n/typeorm';
import type express from 'express';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { TagService } from '@/services/tag.service';
import type { TagRequest } from '../../../types';

View File

@@ -1,7 +1,7 @@
import { VariablesRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import type { Response } from 'express';
import { VariablesRepository } from '@/databases/repositories/variables.repository';
import { VariablesController } from '@/environments.ee/variables/variables.controller.ee';
import type { PaginatedRequest } from '@/public-api/types';
import type { VariablesRequest } from '@/requests';

View File

@@ -1,5 +1,5 @@
import { GlobalConfig } from '@n8n/config';
import { WorkflowEntity, ProjectRepository } from '@n8n/db';
import { WorkflowEntity, ProjectRepository, TagRepository } from '@n8n/db';
import { Container } from '@n8n/di';
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
import { In, Like, QueryFailedError } from '@n8n/typeorm';
@@ -10,7 +10,6 @@ import { v4 as uuid } from 'uuid';
import { z } from 'zod';
import { ActiveWorkflowManager } from '@/active-workflow-manager';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import { EventService } from '@/events/event.service';
import { ExternalHooks } from '@/external-hooks';

View File

@@ -1,12 +1,11 @@
import { GlobalConfig } from '@n8n/config';
import type { Project, User } from '@n8n/db';
import { WorkflowEntity, WorkflowTagMapping, SharedWorkflow } from '@n8n/db';
import { WorkflowEntity, WorkflowTagMapping, SharedWorkflow, TagRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import type { Scope, WorkflowSharingRole } from '@n8n/permissions';
import type { WorkflowId } from 'n8n-workflow';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import * as Db from '@/db';
import { License } from '@/license';

View File

@@ -2,6 +2,7 @@ import { GlobalConfig } from '@n8n/config';
import type { Project } from '@n8n/db';
import type { User } from '@n8n/db';
import type { WorkflowStatistics } from '@n8n/db';
import { WorkflowStatisticsRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import {
QueryFailedError,
@@ -20,7 +21,6 @@ import {
} from 'n8n-workflow';
import config from '@/config';
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflow-statistics.repository';
import type { EventService } from '@/events/event.service';
import { OwnershipService } from '@/services/ownership.service';
import { UserService } from '@/services/user.service';

View File

@@ -1,8 +1,7 @@
import type { User } from '@n8n/db';
import { WorkflowStatisticsRepository } from '@n8n/db';
import { Service } from '@n8n/di';
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflow-statistics.repository';
@Service()
export class CtaService {
constructor(private readonly workflowStatisticsRepository: WorkflowStatisticsRepository) {}

View File

@@ -5,13 +5,13 @@ import {
SharedWorkflow,
WorkflowTagMapping,
CredentialsRepository,
TagRepository,
} from '@n8n/db';
import { Service } from '@n8n/di';
import { Logger } from 'n8n-core';
import { type INode, type INodeCredentialsDetails, type IWorkflowBase } from 'n8n-workflow';
import { v4 as uuid } from 'uuid';
import { TagRepository } from '@/databases/repositories/tag.repository';
import * as Db from '@/db';
import { replaceInvalidCredentials } from '@/workflow-helpers';

View File

@@ -1,7 +1,7 @@
import type { TagEntity, ITagWithCountDb } from '@n8n/db';
import { TagRepository } from '@n8n/db';
import { Service } from '@n8n/di';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { ExternalHooks } from '@/external-hooks';
import { validateEntity } from '@/generic-helpers';

View File

@@ -1,4 +1,4 @@
import { StatisticsNames } from '@n8n/db';
import { StatisticsNames, WorkflowStatisticsRepository } from '@n8n/db';
import { Service } from '@n8n/di';
import { Logger } from 'n8n-core';
import type {
@@ -9,7 +9,6 @@ import type {
WorkflowExecuteMode,
} from 'n8n-workflow';
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflow-statistics.repository';
import { EventService } from '@/events/event.service';
import { UserService } from '@/services/user.service';
import { TypedEmitter } from '@/typed-emitter';

View File

@@ -1,7 +1,7 @@
import { User } from '@n8n/db';
import { WorkflowHistoryRepository } from '@n8n/db';
import { mockClear } from 'jest-mock-extended';
import { WorkflowHistoryRepository } from '@/databases/repositories/workflow-history.repository';
import { WorkflowFinderService } from '@/workflows/workflow-finder.service';
import { WorkflowHistoryService } from '@/workflows/workflow-history.ee/workflow-history.service.ee';
import { mockInstance, mockLogger } from '@test/mocking';

View File

@@ -1,8 +1,8 @@
import { WorkflowHistoryRepository } from '@n8n/db';
import { Service } from '@n8n/di';
import { DateTime } from 'luxon';
import { Time } from '@/constants';
import { WorkflowHistoryRepository } from '@/databases/repositories/workflow-history.repository';
import {
getWorkflowHistoryPruneTime,

View File

@@ -1,10 +1,10 @@
import type { User, WorkflowHistory } from '@n8n/db';
import { WorkflowHistoryRepository } from '@n8n/db';
import { Service } from '@n8n/di';
import { Logger } from 'n8n-core';
import type { IWorkflowBase } from 'n8n-workflow';
import { ensureError } from 'n8n-workflow';
import { WorkflowHistoryRepository } from '@/databases/repositories/workflow-history.repository';
import { SharedWorkflowNotFoundError } from '@/errors/shared-workflow-not-found.error';
import { WorkflowHistoryVersionNotFoundError } from '@/errors/workflow-history-version-not-found.error';

View File

@@ -1,6 +1,6 @@
import { GlobalConfig } from '@n8n/config';
import type { User, WorkflowEntity, ListQueryDb } from '@n8n/db';
import { SharedWorkflow, ExecutionRepository } from '@n8n/db';
import { SharedWorkflow, ExecutionRepository, WorkflowTagMappingRepository } from '@n8n/db';
import { Service } from '@n8n/di';
import type { Scope } from '@n8n/permissions';
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
@@ -17,7 +17,6 @@ import { v4 as uuid } from 'uuid';
import { ActiveWorkflowManager } from '@/active-workflow-manager';
import config from '@/config';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { WorkflowTagMappingRepository } from '@/databases/repositories/workflow-tag-mapping.repository';
import type { WorkflowFolderUnionFull } from '@/databases/repositories/workflow.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import { BadRequestError } from '@/errors/response-errors/bad-request.error';

View File

@@ -10,6 +10,7 @@ import {
WorkflowEntity,
ProjectRelationRepository,
ProjectRepository,
TagRepository,
} from '@n8n/db';
import {
Body,
@@ -33,7 +34,6 @@ import { UnexpectedError } from 'n8n-workflow';
import { v4 as uuid } from 'uuid';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import * as Db from '@/db';
import { BadRequestError } from '@/errors/response-errors/bad-request.error';

View File

@@ -1,10 +1,10 @@
import type { User } from '@n8n/db';
import type { AnnotationTagEntity } from '@n8n/db';
import { TestDefinitionRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { mockInstance } from 'n8n-core/test/utils';
import type { IWorkflowBase } from 'n8n-workflow';
import { TestDefinitionRepository } from '@/databases/repositories/test-definition.repository.ee';
import { TestRunnerService } from '@/evaluation.ee/test-runner/test-runner.service.ee';
import { createAnnotationTags } from '@test-integration/db/executions';

View File

@@ -1,12 +1,12 @@
import type { User } from '@n8n/db';
import type { TestDefinition } from '@n8n/db';
import { ProjectRepository } from '@n8n/db';
import { TestDefinitionRepository } from '@n8n/db';
import { TestRunRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { mockInstance } from 'n8n-core/test/utils';
import type { IWorkflowBase } from 'n8n-workflow';
import { TestDefinitionRepository } from '@/databases/repositories/test-definition.repository.ee';
import { TestRunRepository } from '@/databases/repositories/test-run.repository.ee';
import { TestRunnerService } from '@/evaluation.ee/test-runner/test-runner.service.ee';
import { createUserShell } from '@test-integration/db/users';
import { createWorkflow } from '@test-integration/db/workflows';

View File

@@ -2,13 +2,13 @@ import type { Project } from '@n8n/db';
import type { User } from '@n8n/db';
import { TagEntity } from '@n8n/db';
import { CredentialsRepository } from '@n8n/db';
import { TagRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { mock } from 'jest-mock-extended';
import type { INode } from 'n8n-workflow';
import { v4 as uuid } from 'uuid';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import { ImportService } from '@/services/import.service';

View File

@@ -1,9 +1,8 @@
import { StatisticsNames } from '@n8n/db';
import { LicenseMetricsRepository } from '@n8n/db';
import { WorkflowStatisticsRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflow-statistics.repository';
import { createManyCredentials } from './shared/db/credentials';
import { createAdmin, createMember, createOwner, createUser } from './shared/db/users';
import { createManyWorkflows } from './shared/db/workflows';

View File

@@ -2,13 +2,13 @@ import type { TagEntity } from '@n8n/db';
import { ApiKeyRepository } from '@n8n/db';
import { CredentialsRepository } from '@n8n/db';
import { ProjectRepository } from '@n8n/db';
import { TagRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { randomString } from 'n8n-workflow';
import validator from 'validator';
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { getOwnerOnlyApiKeyScopes } from '@/public-api/permissions.ee';
import { affixRoleToSaveCredential, createCredentials } from '@test-integration/db/credentials';
import { createErrorExecution, createSuccessfulExecution } from '@test-integration/db/executions';

View File

@@ -1,8 +1,7 @@
import type { User } from '@n8n/db';
import { TagRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { createTag } from '../shared/db/tags';
import { createMemberWithApiKey, createOwnerWithApiKey } from '../shared/db/users';
import * as testDb from '../shared/test-db';

View File

@@ -3,6 +3,7 @@ import type { Project } from '@n8n/db';
import type { TagEntity } from '@n8n/db';
import type { User } from '@n8n/db';
import { ProjectRepository } from '@n8n/db';
import { WorkflowHistoryRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { InstanceSettings } from 'n8n-core';
import type { INode } from 'n8n-workflow';
@@ -10,7 +11,6 @@ import type { INode } from 'n8n-workflow';
import { ActiveWorkflowManager } from '@/active-workflow-manager';
import { STARTING_NODES } from '@/constants';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { WorkflowHistoryRepository } from '@/databases/repositories/workflow-history.repository';
import { ExecutionService } from '@/executions/execution.service';
import { ProjectService } from '@/services/project.service.ee';
import { Telemetry } from '@/telemetry';

View File

@@ -1,12 +1,11 @@
import { generateNanoId } from '@n8n/db';
import type { TagEntity } from '@n8n/db';
import type { WorkflowEntity } from '@n8n/db';
import { generateNanoId } from '@n8n/db';
import { TagRepository } from '@n8n/db';
import { WorkflowTagMappingRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import type { IWorkflowBase } from 'n8n-workflow';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { WorkflowTagMappingRepository } from '@/databases/repositories/workflow-tag-mapping.repository';
import { randomName } from '../random';
export async function createTag(attributes: Partial<TagEntity> = {}, workflow?: IWorkflowBase) {

View File

@@ -1,9 +1,8 @@
import { generateNanoId } from '@n8n/db';
import { VariablesRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { randomString } from 'n8n-workflow';
import { VariablesRepository } from '@/databases/repositories/variables.repository';
export async function createVariable(key = randomString(5), value = randomString(5)) {
return await Container.get(VariablesRepository).save({ id: generateNanoId(), key, value });
}

View File

@@ -1,9 +1,8 @@
import type { WorkflowHistory } from '@n8n/db';
import { WorkflowHistoryRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { v4 as uuid } from 'uuid';
import { WorkflowHistoryRepository } from '@/databases/repositories/workflow-history.repository';
export async function createWorkflowHistoryItem(
workflowId: string,
data?: Partial<WorkflowHistory>,

View File

@@ -1,9 +1,8 @@
import { StatisticsNames, type WorkflowStatistics } from '@n8n/db';
import { WorkflowStatisticsRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import type { Workflow } from 'n8n-workflow';
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflow-statistics.repository';
export async function createWorkflowStatisticsItem(
workflowId: Workflow['id'],
data?: Partial<WorkflowStatistics>,

View File

@@ -1,7 +1,6 @@
import { TagRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { createUserShell } from './shared/db/users';
import * as testDb from './shared/test-db';
import type { SuperAgentTest } from './shared/types';

View File

@@ -1,8 +1,8 @@
import { generateNanoId } from '@n8n/db';
import type { Variables } from '@n8n/db';
import { generateNanoId } from '@n8n/db';
import { VariablesRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { VariablesRepository } from '@/databases/repositories/variables.repository';
import { VariablesService } from '@/environments.ee/variables/variables.service.ee';
import { CacheService } from '@/services/cache/cache.service';

View File

@@ -1,9 +1,9 @@
import { GlobalConfig } from '@n8n/config';
import { WorkflowHistoryRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { In } from '@n8n/typeorm';
import { DateTime } from 'luxon';
import { WorkflowHistoryRepository } from '@/databases/repositories/workflow-history.repository';
import { License } from '@/license';
import { WorkflowHistoryManager } from '@/workflows/workflow-history.ee/workflow-history-manager.ee';

View File

@@ -1,8 +1,7 @@
import { TagRepository } from '@n8n/db';
import { WorkflowTagMappingRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import { TagRepository } from '@/databases/repositories/tag.repository';
import { WorkflowTagMappingRepository } from '@/databases/repositories/workflow-tag-mapping.repository';
import { createWorkflow } from './shared/db/workflows';
import * as testDb from './shared/test-db';

View File

@@ -2,6 +2,7 @@ import type { Project } from '@n8n/db';
import type { User } from '@n8n/db';
import type { WorkflowWithSharingsMetaDataAndCredentials } from '@n8n/db';
import { ProjectRepository } from '@n8n/db';
import { WorkflowHistoryRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import type { ProjectRole } from '@n8n/permissions';
import { ApplicationError, WorkflowActivationError, type INode } from 'n8n-workflow';
@@ -10,7 +11,6 @@ import { v4 as uuid } from 'uuid';
import { ActiveWorkflowManager } from '@/active-workflow-manager';
import config from '@/config';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { WorkflowHistoryRepository } from '@/databases/repositories/workflow-history.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import { UserManagementMailer } from '@/user-management/email';
import { mockInstance } from '@test/mocking';

View File

@@ -1,6 +1,7 @@
import type { User } from '@n8n/db';
import type { ListQueryDb } from '@n8n/db';
import { ProjectRepository } from '@n8n/db';
import { WorkflowHistoryRepository } from '@n8n/db';
import { Container } from '@n8n/di';
import type { Scope } from '@n8n/permissions';
import { DateTime } from 'luxon';
@@ -9,7 +10,6 @@ import { v4 as uuid } from 'uuid';
import { ActiveWorkflowManager } from '@/active-workflow-manager';
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
import { WorkflowHistoryRepository } from '@/databases/repositories/workflow-history.repository';
import type { WorkflowFolderUnionFull } from '@/databases/repositories/workflow.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import { License } from '@/license';

12
pnpm-lock.yaml generated
View File

@@ -21982,7 +21982,7 @@ snapshots:
eslint-import-resolver-node@0.3.9:
dependencies:
debug: 3.2.7(supports-color@5.5.0)
debug: 3.2.7(supports-color@8.1.1)
is-core-module: 2.13.1
resolve: 1.22.8
transitivePeerDependencies:
@@ -22007,7 +22007,7 @@ snapshots:
eslint-module-utils@2.8.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0):
dependencies:
debug: 3.2.7(supports-color@5.5.0)
debug: 3.2.7(supports-color@8.1.1)
optionalDependencies:
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.8.2)
eslint: 8.57.0
@@ -22027,7 +22027,7 @@ snapshots:
array.prototype.findlastindex: 1.2.3
array.prototype.flat: 1.3.2
array.prototype.flatmap: 1.3.2
debug: 3.2.7(supports-color@5.5.0)
debug: 3.2.7(supports-color@8.1.1)
doctrine: 2.1.0
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
@@ -22846,7 +22846,7 @@ snapshots:
array-parallel: 0.1.3
array-series: 0.1.5
cross-spawn: 7.0.6
debug: 3.2.7(supports-color@5.5.0)
debug: 3.2.7(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
@@ -25707,7 +25707,7 @@ snapshots:
pdf-parse@1.1.1:
dependencies:
debug: 3.2.7(supports-color@5.5.0)
debug: 3.2.7(supports-color@8.1.1)
node-ensure: 0.0.0
transitivePeerDependencies:
- supports-color
@@ -26546,7 +26546,7 @@ snapshots:
rhea@1.0.24:
dependencies:
debug: 3.2.7(supports-color@5.5.0)
debug: 3.2.7(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color