mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-24 20:24:05 -08:00
refactor(core): Enable import/order eslint rule (#10794)
Some checks are pending
Test Master / install-and-build (push) Waiting to run
Test Master / Unit tests (18.x) (push) Blocked by required conditions
Test Master / Unit tests (20.x) (push) Blocked by required conditions
Test Master / Unit tests (22.4) (push) Blocked by required conditions
Test Master / Lint (push) Blocked by required conditions
Test Master / Notify Slack on failure (push) Blocked by required conditions
Benchmark Docker Image CI / build (push) Waiting to run
Some checks are pending
Test Master / install-and-build (push) Waiting to run
Test Master / Unit tests (18.x) (push) Blocked by required conditions
Test Master / Unit tests (20.x) (push) Blocked by required conditions
Test Master / Unit tests (22.4) (push) Blocked by required conditions
Test Master / Lint (push) Blocked by required conditions
Test Master / Notify Slack on failure (push) Blocked by required conditions
Benchmark Docker Image CI / build (push) Waiting to run
This commit is contained in:
parent
6530620e9d
commit
5156313074
|
@ -28,7 +28,17 @@ module.exports = {
|
||||||
|
|
||||||
// TODO: Remove this
|
// TODO: Remove this
|
||||||
'import/no-cycle': 'warn',
|
'import/no-cycle': 'warn',
|
||||||
'import/order': 'off',
|
'import/order': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
alphabetize: {
|
||||||
|
order: 'asc',
|
||||||
|
caseInsensitive: true,
|
||||||
|
},
|
||||||
|
groups: [['builtin', 'external'], 'internal', ['parent', 'index', 'sibling'], 'object'],
|
||||||
|
'newlines-between': 'always',
|
||||||
|
},
|
||||||
|
],
|
||||||
'import/extensions': 'warn',
|
'import/extensions': 'warn',
|
||||||
'@typescript-eslint/ban-ts-comment': ['warn', { 'ts-ignore': true }],
|
'@typescript-eslint/ban-ts-comment': ['warn', { 'ts-ignore': true }],
|
||||||
'@typescript-eslint/no-explicit-any': 'warn',
|
'@typescript-eslint/no-explicit-any': 'warn',
|
||||||
|
|
|
@ -1,15 +1,16 @@
|
||||||
import { ActiveExecutions } from '@/active-executions';
|
import { mock } from 'jest-mock-extended';
|
||||||
import PCancelable from 'p-cancelable';
|
|
||||||
import { v4 as uuid } from 'uuid';
|
|
||||||
import type {
|
import type {
|
||||||
IExecuteResponsePromiseData,
|
IExecuteResponsePromiseData,
|
||||||
IRun,
|
IRun,
|
||||||
IWorkflowExecutionDataProcess,
|
IWorkflowExecutionDataProcess,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
import { createDeferredPromise } from 'n8n-workflow';
|
import { createDeferredPromise } from 'n8n-workflow';
|
||||||
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
import PCancelable from 'p-cancelable';
|
||||||
import { mock } from 'jest-mock-extended';
|
import { v4 as uuid } from 'uuid';
|
||||||
|
|
||||||
|
import { ActiveExecutions } from '@/active-executions';
|
||||||
import { ConcurrencyControlService } from '@/concurrency/concurrency-control.service';
|
import { ConcurrencyControlService } from '@/concurrency/concurrency-control.service';
|
||||||
|
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
||||||
import { mockInstance } from '@test/mocking';
|
import { mockInstance } from '@test/mocking';
|
||||||
|
|
||||||
const FAKE_EXECUTION_ID = '15';
|
const FAKE_EXECUTION_ID = '15';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { CredentialTypes } from '@/credential-types';
|
|
||||||
import { Container } from 'typedi';
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
|
import { CredentialTypes } from '@/credential-types';
|
||||||
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
||||||
import { mockInstance } from '@test/mocking';
|
import { mockInstance } from '@test/mocking';
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import Container from 'typedi';
|
|
||||||
import type {
|
import type {
|
||||||
IAuthenticateGeneric,
|
IAuthenticateGeneric,
|
||||||
ICredentialDataDecryptedObject,
|
ICredentialDataDecryptedObject,
|
||||||
|
@ -9,11 +8,13 @@ import type {
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
import { NodeConnectionType, deepCopy } from 'n8n-workflow';
|
import { NodeConnectionType, deepCopy } from 'n8n-workflow';
|
||||||
import { Workflow } from 'n8n-workflow';
|
import { Workflow } from 'n8n-workflow';
|
||||||
|
import Container from 'typedi';
|
||||||
|
|
||||||
import { CredentialsHelper } from '@/credentials-helper';
|
import { CredentialsHelper } from '@/credentials-helper';
|
||||||
import { NodeTypes } from '@/node-types';
|
|
||||||
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
|
||||||
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
|
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
||||||
|
import { NodeTypes } from '@/node-types';
|
||||||
import { mockInstance } from '@test/mocking';
|
import { mockInstance } from '@test/mocking';
|
||||||
|
|
||||||
describe('CredentialsHelper', () => {
|
describe('CredentialsHelper', () => {
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
import { LicenseManager } from '@n8n_io/license-sdk';
|
import { LicenseManager } from '@n8n_io/license-sdk';
|
||||||
import { InstanceSettings } from 'n8n-core';
|
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
|
import { InstanceSettings } from 'n8n-core';
|
||||||
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
|
import { N8N_VERSION } from '@/constants';
|
||||||
import { License } from '@/license';
|
import { License } from '@/license';
|
||||||
import { Logger } from '@/logger';
|
import { Logger } from '@/logger';
|
||||||
import { N8N_VERSION } from '@/constants';
|
|
||||||
import { mockInstance } from '@test/mocking';
|
|
||||||
import { OrchestrationService } from '@/services/orchestration.service';
|
import { OrchestrationService } from '@/services/orchestration.service';
|
||||||
|
import { mockInstance } from '@test/mocking';
|
||||||
|
|
||||||
jest.mock('@n8n_io/license-sdk');
|
jest.mock('@n8n_io/license-sdk');
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import { WaitTracker } from '@/wait-tracker';
|
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
|
|
||||||
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
||||||
import type { IExecutionResponse } from '@/interfaces';
|
import type { IExecutionResponse } from '@/interfaces';
|
||||||
import { OrchestrationService } from '@/services/orchestration.service';
|
|
||||||
import type { MultiMainSetup } from '@/services/orchestration/main/multi-main-setup.ee';
|
import type { MultiMainSetup } from '@/services/orchestration/main/multi-main-setup.ee';
|
||||||
|
import { OrchestrationService } from '@/services/orchestration.service';
|
||||||
|
import { WaitTracker } from '@/wait-tracker';
|
||||||
|
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import { VariablesService } from '@/environments/variables/variables.service.ee';
|
|
||||||
import { mockInstance } from '@test/mocking';
|
|
||||||
import { getBase } from '@/workflow-execute-additional-data';
|
|
||||||
import Container from 'typedi';
|
import Container from 'typedi';
|
||||||
|
|
||||||
import { CredentialsHelper } from '@/credentials-helper';
|
import { CredentialsHelper } from '@/credentials-helper';
|
||||||
import { SecretsHelper } from '@/secrets-helpers';
|
import { VariablesService } from '@/environments/variables/variables.service.ee';
|
||||||
import { EventService } from '@/events/event.service';
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { SecretsHelper } from '@/secrets-helpers';
|
||||||
|
import { getBase } from '@/workflow-execute-additional-data';
|
||||||
|
import { mockInstance } from '@test/mocking';
|
||||||
|
|
||||||
describe('WorkflowExecuteAdditionalData', () => {
|
describe('WorkflowExecuteAdditionalData', () => {
|
||||||
const variablesService = mockInstance(VariablesService);
|
const variablesService = mockInstance(VariablesService);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import type { Workflow, IWorkflowExecutionDataProcess } from 'n8n-workflow';
|
import type { Workflow, IWorkflowExecutionDataProcess } from 'n8n-workflow';
|
||||||
|
|
||||||
import { getExecutionStartNode } from '@/workflow-helpers';
|
import { getExecutionStartNode } from '@/workflow-helpers';
|
||||||
|
|
||||||
describe('WorkflowHelpers', () => {
|
describe('WorkflowHelpers', () => {
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
import Container from 'typedi';
|
|
||||||
import { WorkflowHooks, type ExecutionError, type IWorkflowExecuteHooks } from 'n8n-workflow';
|
import { WorkflowHooks, type ExecutionError, type IWorkflowExecuteHooks } from 'n8n-workflow';
|
||||||
import type { User } from '@/databases/entities/user';
|
import Container from 'typedi';
|
||||||
import { WorkflowRunner } from '@/workflow-runner';
|
|
||||||
import config from '@/config';
|
|
||||||
|
|
||||||
import * as testDb from '@test-integration/test-db';
|
import config from '@/config';
|
||||||
import { setupTestServer } from '@test-integration/utils';
|
import type { User } from '@/databases/entities/user';
|
||||||
|
import { Telemetry } from '@/telemetry';
|
||||||
|
import { WorkflowRunner } from '@/workflow-runner';
|
||||||
|
import { mockInstance } from '@test/mocking';
|
||||||
|
import { createExecution } from '@test-integration/db/executions';
|
||||||
import { createUser } from '@test-integration/db/users';
|
import { createUser } from '@test-integration/db/users';
|
||||||
import { createWorkflow } from '@test-integration/db/workflows';
|
import { createWorkflow } from '@test-integration/db/workflows';
|
||||||
import { createExecution } from '@test-integration/db/executions';
|
import * as testDb from '@test-integration/test-db';
|
||||||
import { mockInstance } from '@test/mocking';
|
import { setupTestServer } from '@test-integration/utils';
|
||||||
import { Telemetry } from '@/telemetry';
|
|
||||||
|
|
||||||
let owner: User;
|
let owner: User;
|
||||||
let runner: WorkflowRunner;
|
let runner: WorkflowRunner;
|
||||||
|
|
|
@ -1,28 +1,29 @@
|
||||||
import { Container, Service } from 'typedi';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
import { readFile } from 'fs/promises';
|
import compression from 'compression';
|
||||||
import type { Server } from 'http';
|
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
import { engine as expressHandlebars } from 'express-handlebars';
|
import { engine as expressHandlebars } from 'express-handlebars';
|
||||||
import compression from 'compression';
|
import { readFile } from 'fs/promises';
|
||||||
|
import type { Server } from 'http';
|
||||||
import isbot from 'isbot';
|
import isbot from 'isbot';
|
||||||
|
import { Container, Service } from 'typedi';
|
||||||
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import { N8N_VERSION, TEMPLATES_DIR, inDevelopment, inTest } from '@/constants';
|
import { N8N_VERSION, TEMPLATES_DIR, inDevelopment, inTest } from '@/constants';
|
||||||
import * as Db from '@/db';
|
import * as Db from '@/db';
|
||||||
import { N8nInstanceType } from '@/interfaces';
|
import { OnShutdown } from '@/decorators/on-shutdown';
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
import { send, sendErrorResponse } from '@/response-helper';
|
import { N8nInstanceType } from '@/interfaces';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
import { rawBodyReader, bodyParser, corsMiddleware } from '@/middlewares';
|
import { rawBodyReader, bodyParser, corsMiddleware } from '@/middlewares';
|
||||||
|
import { send, sendErrorResponse } from '@/response-helper';
|
||||||
import { WaitingForms } from '@/waiting-forms';
|
import { WaitingForms } from '@/waiting-forms';
|
||||||
|
import { LiveWebhooks } from '@/webhooks/live-webhooks';
|
||||||
import { TestWebhooks } from '@/webhooks/test-webhooks';
|
import { TestWebhooks } from '@/webhooks/test-webhooks';
|
||||||
import { WaitingWebhooks } from '@/webhooks/waiting-webhooks';
|
import { WaitingWebhooks } from '@/webhooks/waiting-webhooks';
|
||||||
import { createWebhookHandlerFor } from '@/webhooks/webhook-request-handler';
|
import { createWebhookHandlerFor } from '@/webhooks/webhook-request-handler';
|
||||||
import { LiveWebhooks } from '@/webhooks/live-webhooks';
|
|
||||||
import { generateHostInstanceId } from './databases/utils/generators';
|
import { generateHostInstanceId } from './databases/utils/generators';
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { ServiceUnavailableError } from './errors/response-errors/service-unavailable.error';
|
import { ServiceUnavailableError } from './errors/response-errors/service-unavailable.error';
|
||||||
import { OnShutdown } from '@/decorators/on-shutdown';
|
|
||||||
import { GlobalConfig } from '@n8n/config';
|
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export abstract class AbstractServer {
|
export abstract class AbstractServer {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Service } from 'typedi';
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
import { CacheService } from '@/services/cache/cache.service';
|
import { CacheService } from '@/services/cache/cache.service';
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import { Service } from 'typedi';
|
|
||||||
import type PCancelable from 'p-cancelable';
|
|
||||||
import type {
|
import type {
|
||||||
IDeferredPromise,
|
IDeferredPromise,
|
||||||
IExecuteResponsePromiseData,
|
IExecuteResponsePromiseData,
|
||||||
|
@ -14,16 +12,19 @@ import {
|
||||||
sleep,
|
sleep,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
import { strict as assert } from 'node:assert';
|
import { strict as assert } from 'node:assert';
|
||||||
|
import type PCancelable from 'p-cancelable';
|
||||||
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
|
import { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
||||||
import type {
|
import type {
|
||||||
ExecutionPayload,
|
ExecutionPayload,
|
||||||
IExecutingWorkflowData,
|
IExecutingWorkflowData,
|
||||||
IExecutionDb,
|
IExecutionDb,
|
||||||
IExecutionsCurrentSummary,
|
IExecutionsCurrentSummary,
|
||||||
} from '@/interfaces';
|
} from '@/interfaces';
|
||||||
import { isWorkflowIdValid } from '@/utils';
|
|
||||||
import { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
|
||||||
import { Logger } from '@/logger';
|
import { Logger } from '@/logger';
|
||||||
|
import { isWorkflowIdValid } from '@/utils';
|
||||||
|
|
||||||
import { ConcurrencyControlService } from './concurrency/concurrency-control.service';
|
import { ConcurrencyControlService } from './concurrency/concurrency-control.service';
|
||||||
import config from './config';
|
import config from './config';
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
|
|
||||||
import { Service } from 'typedi';
|
|
||||||
import { ActiveWorkflows, NodeExecuteFunctions } from 'n8n-core';
|
import { ActiveWorkflows, NodeExecuteFunctions } from 'n8n-core';
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
ExecutionError,
|
ExecutionError,
|
||||||
IDeferredPromise,
|
IDeferredPromise,
|
||||||
|
@ -25,30 +23,31 @@ import {
|
||||||
WebhookPathTakenError,
|
WebhookPathTakenError,
|
||||||
ApplicationError,
|
ApplicationError,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
import type { IWorkflowDb } from '@/interfaces';
|
import { ActivationErrorsService } from '@/activation-errors.service';
|
||||||
import * as WebhookHelpers from '@/webhooks/webhook-helpers';
|
|
||||||
import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data';
|
|
||||||
|
|
||||||
import type { WorkflowEntity } from '@/databases/entities/workflow-entity';
|
|
||||||
import { ActiveExecutions } from '@/active-executions';
|
import { ActiveExecutions } from '@/active-executions';
|
||||||
import { ExecutionService } from './executions/execution.service';
|
|
||||||
import {
|
import {
|
||||||
STARTING_NODES,
|
STARTING_NODES,
|
||||||
WORKFLOW_REACTIVATE_INITIAL_TIMEOUT,
|
WORKFLOW_REACTIVATE_INITIAL_TIMEOUT,
|
||||||
WORKFLOW_REACTIVATE_MAX_TIMEOUT,
|
WORKFLOW_REACTIVATE_MAX_TIMEOUT,
|
||||||
} from '@/constants';
|
} from '@/constants';
|
||||||
import { NodeTypes } from '@/node-types';
|
import type { WorkflowEntity } from '@/databases/entities/workflow-entity';
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { WebhookService } from '@/webhooks/webhook.service';
|
|
||||||
import { Logger } from './logger';
|
|
||||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||||
import { OrchestrationService } from '@/services/orchestration.service';
|
import { OnShutdown } from '@/decorators/on-shutdown';
|
||||||
import { ActivationErrorsService } from '@/activation-errors.service';
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import type { IWorkflowDb } from '@/interfaces';
|
||||||
|
import { NodeTypes } from '@/node-types';
|
||||||
import { ActiveWorkflowsService } from '@/services/active-workflows.service';
|
import { ActiveWorkflowsService } from '@/services/active-workflows.service';
|
||||||
|
import { OrchestrationService } from '@/services/orchestration.service';
|
||||||
|
import * as WebhookHelpers from '@/webhooks/webhook-helpers';
|
||||||
|
import { WebhookService } from '@/webhooks/webhook.service';
|
||||||
|
import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data';
|
||||||
import { WorkflowExecutionService } from '@/workflows/workflow-execution.service';
|
import { WorkflowExecutionService } from '@/workflows/workflow-execution.service';
|
||||||
import { WorkflowStaticDataService } from '@/workflows/workflow-static-data.service';
|
import { WorkflowStaticDataService } from '@/workflows/workflow-static-data.service';
|
||||||
import { OnShutdown } from '@/decorators/on-shutdown';
|
|
||||||
|
import { ExecutionService } from './executions/execution.service';
|
||||||
|
import { Logger } from './logger';
|
||||||
|
|
||||||
interface QueuedActivation {
|
interface QueuedActivation {
|
||||||
activationMode: WorkflowActivateMode;
|
activationMode: WorkflowActivateMode;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import jwt from 'jsonwebtoken';
|
|
||||||
import { mock } from 'jest-mock-extended';
|
|
||||||
import type { NextFunction, Response } from 'express';
|
import type { NextFunction, Response } from 'express';
|
||||||
|
import { mock } from 'jest-mock-extended';
|
||||||
|
import jwt from 'jsonwebtoken';
|
||||||
|
|
||||||
import { AuthService } from '@/auth/auth.service';
|
import { AuthService } from '@/auth/auth.service';
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
|
@ -8,9 +8,9 @@ import { AUTH_COOKIE_NAME, Time } from '@/constants';
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
import type { InvalidAuthTokenRepository } from '@/databases/repositories/invalid-auth-token.repository';
|
import type { InvalidAuthTokenRepository } from '@/databases/repositories/invalid-auth-token.repository';
|
||||||
import type { UserRepository } from '@/databases/repositories/user.repository';
|
import type { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
|
import type { AuthenticatedRequest } from '@/requests';
|
||||||
import { JwtService } from '@/services/jwt.service';
|
import { JwtService } from '@/services/jwt.service';
|
||||||
import type { UrlService } from '@/services/url.service';
|
import type { UrlService } from '@/services/url.service';
|
||||||
import type { AuthenticatedRequest } from '@/requests';
|
|
||||||
|
|
||||||
describe('AuthService', () => {
|
describe('AuthService', () => {
|
||||||
config.set('userManagement.jwtSecret', 'random-secret');
|
config.set('userManagement.jwtSecret', 'random-secret');
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import Container, { Service } from 'typedi';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
import type { NextFunction, Response } from 'express';
|
|
||||||
import { createHash } from 'crypto';
|
import { createHash } from 'crypto';
|
||||||
|
import type { NextFunction, Response } from 'express';
|
||||||
import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken';
|
import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken';
|
||||||
|
import Container, { Service } from 'typedi';
|
||||||
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import { AUTH_COOKIE_NAME, RESPONSE_ERROR_MESSAGES, Time } from '@/constants';
|
import { AUTH_COOKIE_NAME, RESPONSE_ERROR_MESSAGES, Time } from '@/constants';
|
||||||
|
@ -15,7 +16,6 @@ import { Logger } from '@/logger';
|
||||||
import type { AuthenticatedRequest } from '@/requests';
|
import type { AuthenticatedRequest } from '@/requests';
|
||||||
import { JwtService } from '@/services/jwt.service';
|
import { JwtService } from '@/services/jwt.service';
|
||||||
import { UrlService } from '@/services/url.service';
|
import { UrlService } from '@/services/url.service';
|
||||||
import { GlobalConfig } from '@n8n/config';
|
|
||||||
|
|
||||||
interface AuthJwtPayload {
|
interface AuthJwtPayload {
|
||||||
/** User Id */
|
/** User Id */
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import { Container } from 'typedi';
|
|
||||||
import type { Response } from 'express';
|
import type { Response } from 'express';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
|
|
||||||
import { AuthService } from './auth.service';
|
import { AuthService } from './auth.service';
|
||||||
|
|
||||||
// This method is still used by cloud hooks.
|
// This method is still used by cloud hooks.
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import type { User } from '@/databases/entities/user';
|
|
||||||
import { PasswordUtility } from '@/services/password.utility';
|
|
||||||
import { Container } from 'typedi';
|
import { Container } from 'typedi';
|
||||||
import { isLdapLoginEnabled } from '@/ldap/helpers.ee';
|
|
||||||
|
import type { User } from '@/databases/entities/user';
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
import { AuthError } from '@/errors/response-errors/auth.error';
|
import { AuthError } from '@/errors/response-errors/auth.error';
|
||||||
import { EventService } from '@/events/event.service';
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { isLdapLoginEnabled } from '@/ldap/helpers.ee';
|
||||||
|
import { PasswordUtility } from '@/services/password.utility';
|
||||||
|
|
||||||
export const handleEmailLogin = async (
|
export const handleEmailLogin = async (
|
||||||
email: string,
|
email: string,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { Container } from 'typedi';
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { LdapService } from '@/ldap/ldap.service.ee';
|
import type { User } from '@/databases/entities/user';
|
||||||
|
import { EventService } from '@/events/event.service';
|
||||||
import {
|
import {
|
||||||
createLdapUserOnLocalDb,
|
createLdapUserOnLocalDb,
|
||||||
getUserByEmail,
|
getUserByEmail,
|
||||||
|
@ -10,8 +11,7 @@ import {
|
||||||
createLdapAuthIdentity,
|
createLdapAuthIdentity,
|
||||||
updateLdapUserOnLocalDb,
|
updateLdapUserOnLocalDb,
|
||||||
} from '@/ldap/helpers.ee';
|
} from '@/ldap/helpers.ee';
|
||||||
import type { User } from '@/databases/entities/user';
|
import { LdapService } from '@/ldap/ldap.service.ee';
|
||||||
import { EventService } from '@/events/event.service';
|
|
||||||
|
|
||||||
export const handleLdapLogin = async (
|
export const handleLdapLogin = async (
|
||||||
loginId: string,
|
loginId: string,
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
import { CollaborationState } from '../collaboration.state';
|
|
||||||
import type { CacheService } from '@/services/cache/cache.service';
|
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
|
|
||||||
|
import type { CacheService } from '@/services/cache/cache.service';
|
||||||
|
|
||||||
|
import { CollaborationState } from '../collaboration.state';
|
||||||
|
|
||||||
const origDate = global.Date;
|
const origDate = global.Date;
|
||||||
|
|
||||||
const mockDateFactory = (currentDate: string) => {
|
const mockDateFactory = (currentDate: string) => {
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import { Service } from 'typedi';
|
|
||||||
import type { Workflow } from 'n8n-workflow';
|
import type { Workflow } from 'n8n-workflow';
|
||||||
import { ApplicationError, ErrorReporterProxy } from 'n8n-workflow';
|
import { ApplicationError, ErrorReporterProxy } from 'n8n-workflow';
|
||||||
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
import { Push } from '@/push';
|
|
||||||
import type { ICollaboratorsChanged } from '@/interfaces';
|
|
||||||
import type { OnPushMessage } from '@/push/types';
|
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
|
||||||
import type { User } from '@/databases/entities/user';
|
|
||||||
import { CollaborationState } from '@/collaboration/collaboration.state';
|
import { CollaborationState } from '@/collaboration/collaboration.state';
|
||||||
|
import type { User } from '@/databases/entities/user';
|
||||||
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
|
import type { ICollaboratorsChanged } from '@/interfaces';
|
||||||
|
import { Push } from '@/push';
|
||||||
|
import type { OnPushMessage } from '@/push/types';
|
||||||
import { AccessService } from '@/services/access.service';
|
import { AccessService } from '@/services/access.service';
|
||||||
|
|
||||||
import type { WorkflowClosedMessage, WorkflowOpenedMessage } from './collaboration.message';
|
import type { WorkflowClosedMessage, WorkflowOpenedMessage } from './collaboration.message';
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { Service } from 'typedi';
|
|
||||||
import type { Workflow } from 'n8n-workflow';
|
import type { Workflow } from 'n8n-workflow';
|
||||||
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
import { Time } from '@/constants';
|
import { Time } from '@/constants';
|
||||||
|
import type { User } from '@/databases/entities/user';
|
||||||
import type { Iso8601DateTimeString } from '@/interfaces';
|
import type { Iso8601DateTimeString } from '@/interfaces';
|
||||||
import { CacheService } from '@/services/cache/cache.service';
|
import { CacheService } from '@/services/cache/cache.service';
|
||||||
import type { User } from '@/databases/entities/user';
|
|
||||||
|
|
||||||
type WorkflowCacheHash = Record<User['id'], Iso8601DateTimeString>;
|
type WorkflowCacheHash = Record<User['id'], Iso8601DateTimeString>;
|
||||||
interface CacheEntry {
|
interface CacheEntry {
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Flags } from '@oclif/core';
|
import { Flags } from '@oclif/core';
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { SecurityAuditService } from '@/security-audit/security-audit.service';
|
|
||||||
import { RISK_CATEGORIES } from '@/security-audit/constants';
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
|
import { RISK_CATEGORIES } from '@/security-audit/constants';
|
||||||
|
import { SecurityAuditService } from '@/security-audit/security-audit.service';
|
||||||
import type { Risk } from '@/security-audit/types';
|
import type { Risk } from '@/security-audit/types';
|
||||||
|
|
||||||
import { BaseCommand } from './base-command';
|
import { BaseCommand } from './base-command';
|
||||||
|
|
||||||
export class SecurityAudit extends BaseCommand {
|
export class SecurityAudit extends BaseCommand {
|
||||||
|
|
|
@ -1,29 +1,30 @@
|
||||||
import 'reflect-metadata';
|
import 'reflect-metadata';
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Command, Errors } from '@oclif/core';
|
|
||||||
import { GlobalConfig } from '@n8n/config';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
import { ApplicationError, ErrorReporterProxy as ErrorReporter, sleep } from 'n8n-workflow';
|
import { Command, Errors } from '@oclif/core';
|
||||||
import { BinaryDataService, InstanceSettings, ObjectStoreService } from 'n8n-core';
|
import { BinaryDataService, InstanceSettings, ObjectStoreService } from 'n8n-core';
|
||||||
|
import { ApplicationError, ErrorReporterProxy as ErrorReporter, sleep } from 'n8n-workflow';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import type { AbstractServer } from '@/abstract-server';
|
import type { AbstractServer } from '@/abstract-server';
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import * as Db from '@/db';
|
|
||||||
import * as CrashJournal from '@/crash-journal';
|
|
||||||
import { LICENSE_FEATURES, inDevelopment, inTest } from '@/constants';
|
import { LICENSE_FEATURES, inDevelopment, inTest } from '@/constants';
|
||||||
import { initErrorHandling } from '@/error-reporting';
|
import * as CrashJournal from '@/crash-journal';
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { NodeTypes } from '@/node-types';
|
|
||||||
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
|
||||||
import type { N8nInstanceType } from '@/interfaces';
|
|
||||||
import { PostHogClient } from '@/posthog';
|
|
||||||
import { License } from '@/license';
|
|
||||||
import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee';
|
|
||||||
import { initExpressionEvaluator } from '@/expression-evaluator';
|
|
||||||
import { generateHostInstanceId } from '@/databases/utils/generators';
|
import { generateHostInstanceId } from '@/databases/utils/generators';
|
||||||
import { WorkflowHistoryManager } from '@/workflows/workflow-history/workflow-history-manager.ee';
|
import * as Db from '@/db';
|
||||||
import { ShutdownService } from '@/shutdown/shutdown.service';
|
import { initErrorHandling } from '@/error-reporting';
|
||||||
import { TelemetryEventRelay } from '@/events/telemetry-event-relay';
|
|
||||||
import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus';
|
import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus';
|
||||||
|
import { TelemetryEventRelay } from '@/events/telemetry-event-relay';
|
||||||
|
import { initExpressionEvaluator } from '@/expression-evaluator';
|
||||||
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee';
|
||||||
|
import type { N8nInstanceType } from '@/interfaces';
|
||||||
|
import { License } from '@/license';
|
||||||
|
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { NodeTypes } from '@/node-types';
|
||||||
|
import { PostHogClient } from '@/posthog';
|
||||||
|
import { ShutdownService } from '@/shutdown/shutdown.service';
|
||||||
|
import { WorkflowHistoryManager } from '@/workflows/workflow-history/workflow-history-manager.ee';
|
||||||
|
|
||||||
export abstract class BaseCommand extends Command {
|
export abstract class BaseCommand extends Command {
|
||||||
protected logger = Container.get(Logger);
|
protected logger = Container.get(Logger);
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
import { main } from '@/commands/db/revert';
|
|
||||||
import { mockInstance } from '@test/mocking';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import type { IrreversibleMigration, ReversibleMigration } from '@/databases/types';
|
|
||||||
import type { Migration, MigrationExecutor } from '@n8n/typeorm';
|
import type { Migration, MigrationExecutor } from '@n8n/typeorm';
|
||||||
import { type DataSource } from '@n8n/typeorm';
|
import { type DataSource } from '@n8n/typeorm';
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
|
|
||||||
|
import { main } from '@/commands/db/revert';
|
||||||
|
import type { IrreversibleMigration, ReversibleMigration } from '@/databases/types';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { mockInstance } from '@test/mocking';
|
||||||
|
|
||||||
const logger = mockInstance(Logger);
|
const logger = mockInstance(Logger);
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
import { Command, Flags } from '@oclif/core';
|
|
||||||
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
||||||
import type { DataSourceOptions as ConnectionOptions } from '@n8n/typeorm';
|
import type { DataSourceOptions as ConnectionOptions } from '@n8n/typeorm';
|
||||||
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
||||||
import { MigrationExecutor, DataSource as Connection } from '@n8n/typeorm';
|
import { MigrationExecutor, DataSource as Connection } from '@n8n/typeorm';
|
||||||
|
import { Command, Flags } from '@oclif/core';
|
||||||
import { Container } from 'typedi';
|
import { Container } from 'typedi';
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { getConnectionOptions } from '@/databases/config';
|
import { getConnectionOptions } from '@/databases/config';
|
||||||
import type { Migration } from '@/databases/types';
|
import type { Migration } from '@/databases/types';
|
||||||
import { wrapMigration } from '@/databases/utils/migration-helpers';
|
import { wrapMigration } from '@/databases/utils/migration-helpers';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
|
||||||
// This function is extracted to make it easier to unit test it.
|
// 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
|
// Mocking turned into a mess due to this command using typeorm and the db
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
/* eslint-disable @typescript-eslint/no-loop-func */
|
/* eslint-disable @typescript-eslint/no-loop-func */
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Flags } from '@oclif/core';
|
import { Flags } from '@oclif/core';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import os from 'os';
|
|
||||||
import type { IRun, ITaskData, IWorkflowExecutionDataProcess } from 'n8n-workflow';
|
|
||||||
import { ApplicationError, jsonParse } from 'n8n-workflow';
|
|
||||||
import { sep } from 'path';
|
|
||||||
import { diff } from 'json-diff';
|
import { diff } from 'json-diff';
|
||||||
import pick from 'lodash/pick';
|
import pick from 'lodash/pick';
|
||||||
|
import type { IRun, ITaskData, IWorkflowExecutionDataProcess } from 'n8n-workflow';
|
||||||
|
import { ApplicationError, jsonParse } from 'n8n-workflow';
|
||||||
|
import os from 'os';
|
||||||
|
import { sep } from 'path';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { ActiveExecutions } from '@/active-executions';
|
import { ActiveExecutions } from '@/active-executions';
|
||||||
import { WorkflowRunner } from '@/workflow-runner';
|
|
||||||
import type { IWorkflowDb } from '@/interfaces';
|
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||||
|
import type { IWorkflowDb } from '@/interfaces';
|
||||||
import { OwnershipService } from '@/services/ownership.service';
|
import { OwnershipService } from '@/services/ownership.service';
|
||||||
import { findCliWorkflowStart } from '@/utils';
|
import { findCliWorkflowStart } from '@/utils';
|
||||||
|
import { WorkflowRunner } from '@/workflow-runner';
|
||||||
|
|
||||||
import { BaseCommand } from './base-command';
|
import { BaseCommand } from './base-command';
|
||||||
import type {
|
import type {
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Flags } from '@oclif/core';
|
import { Flags } from '@oclif/core';
|
||||||
import type { IWorkflowBase, IWorkflowExecutionDataProcess } from 'n8n-workflow';
|
import type { IWorkflowBase, IWorkflowExecutionDataProcess } from 'n8n-workflow';
|
||||||
import { ApplicationError, ExecutionBaseError } from 'n8n-workflow';
|
import { ApplicationError, ExecutionBaseError } from 'n8n-workflow';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { ActiveExecutions } from '@/active-executions';
|
import { ActiveExecutions } from '@/active-executions';
|
||||||
import { WorkflowRunner } from '@/workflow-runner';
|
|
||||||
import { findCliWorkflowStart, isWorkflowIdValid } from '@/utils';
|
|
||||||
import { BaseCommand } from './base-command';
|
|
||||||
|
|
||||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||||
import { OwnershipService } from '@/services/ownership.service';
|
import { OwnershipService } from '@/services/ownership.service';
|
||||||
|
import { findCliWorkflowStart, isWorkflowIdValid } from '@/utils';
|
||||||
|
import { WorkflowRunner } from '@/workflow-runner';
|
||||||
|
|
||||||
|
import { BaseCommand } from './base-command';
|
||||||
|
|
||||||
export class Execute extends BaseCommand {
|
export class Execute extends BaseCommand {
|
||||||
static description = '\nExecutes a given workflow';
|
static description = '\nExecutes a given workflow';
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
import { Flags } from '@oclif/core';
|
import { Flags } from '@oclif/core';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import path from 'path';
|
|
||||||
import { Credentials } from 'n8n-core';
|
import { Credentials } from 'n8n-core';
|
||||||
import type { ICredentialsDb, ICredentialsDecryptedDb } from '@/interfaces';
|
|
||||||
import { BaseCommand } from '../base-command';
|
|
||||||
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
|
||||||
import Container from 'typedi';
|
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
|
import path from 'path';
|
||||||
|
import Container from 'typedi';
|
||||||
|
|
||||||
|
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
||||||
|
import type { ICredentialsDb, ICredentialsDecryptedDb } from '@/interfaces';
|
||||||
|
|
||||||
|
import { BaseCommand } from '../base-command';
|
||||||
|
|
||||||
export class ExportCredentialsCommand extends BaseCommand {
|
export class ExportCredentialsCommand extends BaseCommand {
|
||||||
static description = 'Export credentials';
|
static description = 'Export credentials';
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
import { Flags } from '@oclif/core';
|
import { Flags } from '@oclif/core';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import path from 'path';
|
|
||||||
import { BaseCommand } from '../base-command';
|
|
||||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
|
||||||
import Container from 'typedi';
|
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
|
import path from 'path';
|
||||||
|
import Container from 'typedi';
|
||||||
|
|
||||||
|
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||||
|
|
||||||
|
import { BaseCommand } from '../base-command';
|
||||||
|
|
||||||
export class ExportWorkflowsCommand extends BaseCommand {
|
export class ExportWorkflowsCommand extends BaseCommand {
|
||||||
static description = 'Export workflows';
|
static description = 'Export workflows';
|
||||||
|
|
|
@ -1,21 +1,22 @@
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Flags } from '@oclif/core';
|
|
||||||
import { Cipher } from 'n8n-core';
|
|
||||||
import fs from 'fs';
|
|
||||||
import glob from 'fast-glob';
|
|
||||||
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
||||||
import type { EntityManager } from '@n8n/typeorm';
|
import type { EntityManager } from '@n8n/typeorm';
|
||||||
|
import { Flags } from '@oclif/core';
|
||||||
import * as Db from '@/db';
|
import glob from 'fast-glob';
|
||||||
import { SharedCredentials } from '@/databases/entities/shared-credentials';
|
import fs from 'fs';
|
||||||
import { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
import { Cipher } from 'n8n-core';
|
||||||
import { BaseCommand } from '../base-command';
|
|
||||||
import type { ICredentialsEncrypted } from 'n8n-workflow';
|
import type { ICredentialsEncrypted } from 'n8n-workflow';
|
||||||
import { ApplicationError, jsonParse } from 'n8n-workflow';
|
import { ApplicationError, jsonParse } from 'n8n-workflow';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { UM_FIX_INSTRUCTION } from '@/constants';
|
import { UM_FIX_INSTRUCTION } from '@/constants';
|
||||||
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
import { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
import { Project } from '@/databases/entities/project';
|
import { Project } from '@/databases/entities/project';
|
||||||
|
import { SharedCredentials } from '@/databases/entities/shared-credentials';
|
||||||
import { User } from '@/databases/entities/user';
|
import { User } from '@/databases/entities/user';
|
||||||
|
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
||||||
|
import * as Db from '@/db';
|
||||||
|
|
||||||
|
import { BaseCommand } from '../base-command';
|
||||||
|
|
||||||
export class ImportCredentialsCommand extends BaseCommand {
|
export class ImportCredentialsCommand extends BaseCommand {
|
||||||
static description = 'Import credentials';
|
static description = 'Import credentials';
|
||||||
|
|
|
@ -1,19 +1,20 @@
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Flags } from '@oclif/core';
|
import { Flags } from '@oclif/core';
|
||||||
import { ApplicationError, jsonParse } from 'n8n-workflow';
|
|
||||||
import fs from 'fs';
|
|
||||||
import glob from 'fast-glob';
|
import glob from 'fast-glob';
|
||||||
|
import fs from 'fs';
|
||||||
|
import { ApplicationError, jsonParse } from 'n8n-workflow';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { UM_FIX_INSTRUCTION } from '@/constants';
|
import { UM_FIX_INSTRUCTION } from '@/constants';
|
||||||
import type { WorkflowEntity } from '@/databases/entities/workflow-entity';
|
import type { WorkflowEntity } from '@/databases/entities/workflow-entity';
|
||||||
import { generateNanoId } from '@/databases/utils/generators';
|
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
||||||
|
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||||
|
import { generateNanoId } from '@/databases/utils/generators';
|
||||||
import type { IWorkflowToImport } from '@/interfaces';
|
import type { IWorkflowToImport } from '@/interfaces';
|
||||||
import { ImportService } from '@/services/import.service';
|
import { ImportService } from '@/services/import.service';
|
||||||
|
|
||||||
import { BaseCommand } from '../base-command';
|
import { BaseCommand } from '../base-command';
|
||||||
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
|
||||||
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
|
||||||
|
|
||||||
function assertHasWorkflowsToImport(workflows: unknown): asserts workflows is IWorkflowToImport[] {
|
function assertHasWorkflowsToImport(workflows: unknown): asserts workflows is IWorkflowToImport[] {
|
||||||
if (!Array.isArray(workflows)) {
|
if (!Array.isArray(workflows)) {
|
||||||
|
|
|
@ -1,21 +1,23 @@
|
||||||
import Container from 'typedi';
|
|
||||||
import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/ldap/constants';
|
|
||||||
import { AuthIdentityRepository } from '@/databases/repositories/auth-identity.repository';
|
|
||||||
import { AuthProviderSyncHistoryRepository } from '@/databases/repositories/auth-provider-sync-history.repository';
|
|
||||||
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
|
||||||
import { BaseCommand } from '../base-command';
|
|
||||||
import { Flags } from '@oclif/core';
|
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
|
||||||
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
|
||||||
import { WorkflowService } from '@/workflows/workflow.service';
|
|
||||||
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
||||||
import { In } from '@n8n/typeorm';
|
import { In } from '@n8n/typeorm';
|
||||||
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
import { Flags } from '@oclif/core';
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
import { ProjectRelationRepository } from '@/databases/repositories/project-relation.repository';
|
import Container from 'typedi';
|
||||||
import { CredentialsService } from '@/credentials/credentials.service';
|
|
||||||
import { UM_FIX_INSTRUCTION } from '@/constants';
|
import { UM_FIX_INSTRUCTION } from '@/constants';
|
||||||
|
import { CredentialsService } from '@/credentials/credentials.service';
|
||||||
|
import { AuthIdentityRepository } from '@/databases/repositories/auth-identity.repository';
|
||||||
|
import { AuthProviderSyncHistoryRepository } from '@/databases/repositories/auth-provider-sync-history.repository';
|
||||||
|
import { ProjectRelationRepository } from '@/databases/repositories/project-relation.repository';
|
||||||
|
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
||||||
|
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
||||||
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
|
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
||||||
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
|
import { LDAP_DEFAULT_CONFIGURATION, LDAP_FEATURE_NAME } from '@/ldap/constants';
|
||||||
|
import { WorkflowService } from '@/workflows/workflow.service';
|
||||||
|
|
||||||
|
import { BaseCommand } from '../base-command';
|
||||||
|
|
||||||
const wrongFlagsError =
|
const wrongFlagsError =
|
||||||
'You must use exactly one of `--userId`, `--projectId` or `--deleteWorkflowsAndCredentials`.';
|
'You must use exactly one of `--userId`, `--projectId` or `--deleteWorkflowsAndCredentials`.';
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
import { Container } from 'typedi';
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { SETTINGS_LICENSE_CERT_KEY } from '@/constants';
|
import { SETTINGS_LICENSE_CERT_KEY } from '@/constants';
|
||||||
import { BaseCommand } from '../base-command';
|
|
||||||
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
||||||
import { License } from '@/license';
|
import { License } from '@/license';
|
||||||
|
|
||||||
|
import { BaseCommand } from '../base-command';
|
||||||
|
|
||||||
export class ClearLicenseCommand extends BaseCommand {
|
export class ClearLicenseCommand extends BaseCommand {
|
||||||
static description = 'Clear license';
|
static description = 'Clear license';
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import { Container } from 'typedi';
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { License } from '@/license';
|
import { License } from '@/license';
|
||||||
|
|
||||||
import { BaseCommand } from '../base-command';
|
import { BaseCommand } from '../base-command';
|
||||||
|
|
||||||
export class LicenseInfoCommand extends BaseCommand {
|
export class LicenseInfoCommand extends BaseCommand {
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import Container from 'typedi';
|
|
||||||
import { Flags } from '@oclif/core';
|
import { Flags } from '@oclif/core';
|
||||||
|
import Container from 'typedi';
|
||||||
|
|
||||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||||
|
|
||||||
import { BaseCommand } from '../base-command';
|
import { BaseCommand } from '../base-command';
|
||||||
|
|
||||||
export class ListWorkflowCommand extends BaseCommand {
|
export class ListWorkflowCommand extends BaseCommand {
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import Container from 'typedi';
|
|
||||||
import { Flags } from '@oclif/core';
|
import { Flags } from '@oclif/core';
|
||||||
|
import Container from 'typedi';
|
||||||
|
|
||||||
import { AuthUserRepository } from '@/databases/repositories/auth-user.repository';
|
import { AuthUserRepository } from '@/databases/repositories/auth-user.repository';
|
||||||
|
|
||||||
import { BaseCommand } from '../base-command';
|
import { BaseCommand } from '../base-command';
|
||||||
|
|
||||||
export class DisableMFACommand extends BaseCommand {
|
export class DisableMFACommand extends BaseCommand {
|
||||||
|
|
|
@ -1,35 +1,36 @@
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Flags, type Config } from '@oclif/core';
|
import { Flags, type Config } from '@oclif/core';
|
||||||
import path from 'path';
|
|
||||||
import { mkdir } from 'fs/promises';
|
|
||||||
import { createReadStream, createWriteStream, existsSync } from 'fs';
|
|
||||||
import { pipeline } from 'stream/promises';
|
|
||||||
import replaceStream from 'replacestream';
|
|
||||||
import glob from 'fast-glob';
|
import glob from 'fast-glob';
|
||||||
|
import { createReadStream, createWriteStream, existsSync } from 'fs';
|
||||||
|
import { mkdir } from 'fs/promises';
|
||||||
import { jsonParse, randomString, type IWorkflowExecutionDataProcess } from 'n8n-workflow';
|
import { jsonParse, randomString, type IWorkflowExecutionDataProcess } from 'n8n-workflow';
|
||||||
|
import path from 'path';
|
||||||
|
import replaceStream from 'replacestream';
|
||||||
|
import { pipeline } from 'stream/promises';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import config from '@/config';
|
|
||||||
import { ActiveExecutions } from '@/active-executions';
|
import { ActiveExecutions } from '@/active-executions';
|
||||||
import { ActiveWorkflowManager } from '@/active-workflow-manager';
|
import { ActiveWorkflowManager } from '@/active-workflow-manager';
|
||||||
import { Server } from '@/server';
|
import config from '@/config';
|
||||||
import { EDITOR_UI_DIST_DIR, LICENSE_FEATURES } from '@/constants';
|
import { EDITOR_UI_DIST_DIR, LICENSE_FEATURES } from '@/constants';
|
||||||
|
import { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
||||||
|
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
||||||
|
import { FeatureNotLicensedError } from '@/errors/feature-not-licensed.error';
|
||||||
import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus';
|
import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus';
|
||||||
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { ExecutionService } from '@/executions/execution.service';
|
||||||
import { License } from '@/license';
|
import { License } from '@/license';
|
||||||
import { OrchestrationService } from '@/services/orchestration.service';
|
import { Server } from '@/server';
|
||||||
import { OrchestrationHandlerMainService } from '@/services/orchestration/main/orchestration.handler.main.service';
|
import { OrchestrationHandlerMainService } from '@/services/orchestration/main/orchestration.handler.main.service';
|
||||||
|
import { OrchestrationService } from '@/services/orchestration.service';
|
||||||
|
import { OwnershipService } from '@/services/ownership.service';
|
||||||
import { PruningService } from '@/services/pruning.service';
|
import { PruningService } from '@/services/pruning.service';
|
||||||
import { UrlService } from '@/services/url.service';
|
import { UrlService } from '@/services/url.service';
|
||||||
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
|
||||||
import { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
|
||||||
import { FeatureNotLicensedError } from '@/errors/feature-not-licensed.error';
|
|
||||||
import { WaitTracker } from '@/wait-tracker';
|
import { WaitTracker } from '@/wait-tracker';
|
||||||
import { BaseCommand } from './base-command';
|
|
||||||
import { ExecutionService } from '@/executions/execution.service';
|
|
||||||
import { OwnershipService } from '@/services/ownership.service';
|
|
||||||
import { WorkflowRunner } from '@/workflow-runner';
|
import { WorkflowRunner } from '@/workflow-runner';
|
||||||
import { EventService } from '@/events/event.service';
|
|
||||||
|
import { BaseCommand } from './base-command';
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires
|
||||||
const open = require('open');
|
const open = require('open');
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Flags } from '@oclif/core';
|
import { Flags } from '@oclif/core';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||||
|
|
||||||
import { BaseCommand } from '../base-command';
|
import { BaseCommand } from '../base-command';
|
||||||
|
|
||||||
export class UpdateWorkflowCommand extends BaseCommand {
|
export class UpdateWorkflowCommand extends BaseCommand {
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
import { Container } from 'typedi';
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
import { User } from '@/databases/entities/user';
|
import { User } from '@/databases/entities/user';
|
||||||
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
||||||
|
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
||||||
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
|
|
||||||
import { BaseCommand } from '../base-command';
|
import { BaseCommand } from '../base-command';
|
||||||
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
|
||||||
|
|
||||||
const defaultUserProps = {
|
const defaultUserProps = {
|
||||||
firstName: null,
|
firstName: null,
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Flags, type Config } from '@oclif/core';
|
import { Flags, type Config } from '@oclif/core';
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import config from '@/config';
|
|
||||||
import { ActiveExecutions } from '@/active-executions';
|
import { ActiveExecutions } from '@/active-executions';
|
||||||
import { WebhookServer } from '@/webhooks/webhook-server';
|
import config from '@/config';
|
||||||
import { BaseCommand } from './base-command';
|
|
||||||
|
|
||||||
import { OrchestrationWebhookService } from '@/services/orchestration/webhook/orchestration.webhook.service';
|
|
||||||
import { OrchestrationHandlerWebhookService } from '@/services/orchestration/webhook/orchestration.handler.webhook.service';
|
import { OrchestrationHandlerWebhookService } from '@/services/orchestration/webhook/orchestration.handler.webhook.service';
|
||||||
|
import { OrchestrationWebhookService } from '@/services/orchestration/webhook/orchestration.webhook.service';
|
||||||
|
import { WebhookServer } from '@/webhooks/webhook-server';
|
||||||
|
|
||||||
|
import { BaseCommand } from './base-command';
|
||||||
|
|
||||||
export class Webhook extends BaseCommand {
|
export class Webhook extends BaseCommand {
|
||||||
static description = 'Starts n8n webhook process. Intercepts only production URLs.';
|
static description = 'Starts n8n webhook process. Intercepts only production URLs.';
|
||||||
|
|
|
@ -1,26 +1,27 @@
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { Flags, type Config } from '@oclif/core';
|
import { Flags, type Config } from '@oclif/core';
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
import http from 'http';
|
import http from 'http';
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import * as Db from '@/db';
|
|
||||||
import * as ResponseHelper from '@/response-helper';
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import type { ScalingService } from '@/scaling/scaling.service';
|
|
||||||
import { N8N_VERSION, inTest } from '@/constants';
|
import { N8N_VERSION, inTest } from '@/constants';
|
||||||
import type { ICredentialsOverwrite } from '@/interfaces';
|
|
||||||
import { CredentialsOverwrites } from '@/credentials-overwrites';
|
import { CredentialsOverwrites } from '@/credentials-overwrites';
|
||||||
import { rawBodyReader, bodyParser } from '@/middlewares';
|
import * as Db from '@/db';
|
||||||
import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus';
|
import { ServiceUnavailableError } from '@/errors/response-errors/service-unavailable.error';
|
||||||
import type { RedisServicePubSubSubscriber } from '@/services/redis/redis-service-pub-sub-subscriber';
|
|
||||||
import { EventMessageGeneric } from '@/eventbus/event-message-classes/event-message-generic';
|
import { EventMessageGeneric } from '@/eventbus/event-message-classes/event-message-generic';
|
||||||
|
import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus';
|
||||||
|
import { LogStreamingEventRelay } from '@/events/log-streaming-event-relay';
|
||||||
|
import type { ICredentialsOverwrite } from '@/interfaces';
|
||||||
|
import { rawBodyReader, bodyParser } from '@/middlewares';
|
||||||
|
import * as ResponseHelper from '@/response-helper';
|
||||||
|
import { JobProcessor } from '@/scaling/job-processor';
|
||||||
|
import type { ScalingService } from '@/scaling/scaling.service';
|
||||||
import { OrchestrationHandlerWorkerService } from '@/services/orchestration/worker/orchestration.handler.worker.service';
|
import { OrchestrationHandlerWorkerService } from '@/services/orchestration/worker/orchestration.handler.worker.service';
|
||||||
import { OrchestrationWorkerService } from '@/services/orchestration/worker/orchestration.worker.service';
|
import { OrchestrationWorkerService } from '@/services/orchestration/worker/orchestration.worker.service';
|
||||||
import { ServiceUnavailableError } from '@/errors/response-errors/service-unavailable.error';
|
import type { RedisServicePubSubSubscriber } from '@/services/redis/redis-service-pub-sub-subscriber';
|
||||||
|
|
||||||
import { BaseCommand } from './base-command';
|
import { BaseCommand } from './base-command';
|
||||||
import { JobProcessor } from '@/scaling/job-processor';
|
|
||||||
import { LogStreamingEventRelay } from '@/events/log-streaming-event-relay';
|
|
||||||
|
|
||||||
export class Worker extends BaseCommand {
|
export class Worker extends BaseCommand {
|
||||||
static description = '\nStarts a n8n worker';
|
static description = '\nStarts a n8n worker';
|
||||||
|
|
|
@ -1,18 +1,20 @@
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
import config from '@/config';
|
import type { WorkflowExecuteMode as ExecutionMode } from 'n8n-workflow';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
CLOUD_TEMP_PRODUCTION_LIMIT,
|
CLOUD_TEMP_PRODUCTION_LIMIT,
|
||||||
CLOUD_TEMP_REPORTABLE_THRESHOLDS,
|
CLOUD_TEMP_REPORTABLE_THRESHOLDS,
|
||||||
ConcurrencyControlService,
|
ConcurrencyControlService,
|
||||||
} from '@/concurrency/concurrency-control.service';
|
} from '@/concurrency/concurrency-control.service';
|
||||||
import type { Logger } from '@/logger';
|
import config from '@/config';
|
||||||
import { InvalidConcurrencyLimitError } from '@/errors/invalid-concurrency-limit.error';
|
|
||||||
import { ConcurrencyQueue } from '../concurrency-queue';
|
|
||||||
import type { WorkflowExecuteMode as ExecutionMode } from 'n8n-workflow';
|
|
||||||
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
||||||
import type { IExecutingWorkflowData } from '@/interfaces';
|
import { InvalidConcurrencyLimitError } from '@/errors/invalid-concurrency-limit.error';
|
||||||
import type { Telemetry } from '@/telemetry';
|
|
||||||
import type { EventService } from '@/events/event.service';
|
import type { EventService } from '@/events/event.service';
|
||||||
|
import type { IExecutingWorkflowData } from '@/interfaces';
|
||||||
|
import type { Logger } from '@/logger';
|
||||||
|
import type { Telemetry } from '@/telemetry';
|
||||||
|
|
||||||
|
import { ConcurrencyQueue } from '../concurrency-queue';
|
||||||
|
|
||||||
describe('ConcurrencyControlService', () => {
|
describe('ConcurrencyControlService', () => {
|
||||||
const logger = mock<Logger>();
|
const logger = mock<Logger>();
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { sleep } from 'n8n-workflow';
|
import { sleep } from 'n8n-workflow';
|
||||||
|
|
||||||
import { ConcurrencyQueue } from '../concurrency-queue';
|
import { ConcurrencyQueue } from '../concurrency-queue';
|
||||||
|
|
||||||
describe('ConcurrencyQueue', () => {
|
describe('ConcurrencyQueue', () => {
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import config from '@/config';
|
|
||||||
import { Service } from 'typedi';
|
|
||||||
import { ConcurrencyQueue } from './concurrency-queue';
|
|
||||||
import { UnknownExecutionModeError } from '@/errors/unknown-execution-mode.error';
|
|
||||||
import { InvalidConcurrencyLimitError } from '@/errors/invalid-concurrency-limit.error';
|
|
||||||
import { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
|
||||||
import type { WorkflowExecuteMode as ExecutionMode } from 'n8n-workflow';
|
import type { WorkflowExecuteMode as ExecutionMode } from 'n8n-workflow';
|
||||||
import type { IExecutingWorkflowData } from '@/interfaces';
|
import { Service } from 'typedi';
|
||||||
import { Telemetry } from '@/telemetry';
|
|
||||||
|
import config from '@/config';
|
||||||
|
import { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
||||||
|
import { InvalidConcurrencyLimitError } from '@/errors/invalid-concurrency-limit.error';
|
||||||
|
import { UnknownExecutionModeError } from '@/errors/unknown-execution-mode.error';
|
||||||
import { EventService } from '@/events/event.service';
|
import { EventService } from '@/events/event.service';
|
||||||
|
import type { IExecutingWorkflowData } from '@/interfaces';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { Telemetry } from '@/telemetry';
|
||||||
|
|
||||||
|
import { ConcurrencyQueue } from './concurrency-queue';
|
||||||
|
|
||||||
export const CLOUD_TEMP_PRODUCTION_LIMIT = 999;
|
export const CLOUD_TEMP_PRODUCTION_LIMIT = 999;
|
||||||
export const CLOUD_TEMP_REPORTABLE_THRESHOLDS = [5, 10, 20, 50, 100, 200];
|
export const CLOUD_TEMP_REPORTABLE_THRESHOLDS = [5, 10, 20, 50, 100, 200];
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Service } from 'typedi';
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
import { TypedEmitter } from '@/typed-emitter';
|
import { TypedEmitter } from '@/typed-emitter';
|
||||||
|
|
||||||
type ConcurrencyEvents = {
|
type ConcurrencyEvents = {
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
import { Container } from 'typedi';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
import convict from 'convict';
|
import convict from 'convict';
|
||||||
import dotenv from 'dotenv';
|
import dotenv from 'dotenv';
|
||||||
import { readFileSync } from 'fs';
|
|
||||||
import { flatten } from 'flat';
|
import { flatten } from 'flat';
|
||||||
|
import { readFileSync } from 'fs';
|
||||||
import merge from 'lodash/merge';
|
import merge from 'lodash/merge';
|
||||||
import { GlobalConfig } from '@n8n/config';
|
|
||||||
import { ApplicationError, setGlobalState } from 'n8n-workflow';
|
import { ApplicationError, setGlobalState } from 'n8n-workflow';
|
||||||
|
import colors from 'picocolors';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { inTest, inE2ETests } from '@/constants';
|
import { inTest, inE2ETests } from '@/constants';
|
||||||
|
|
||||||
|
@ -104,7 +105,6 @@ if (userManagement.jwtRefreshTimeoutHours >= userManagement.jwtSessionDurationHo
|
||||||
config.set('userManagement.jwtRefreshTimeoutHours', 0);
|
config.set('userManagement.jwtRefreshTimeoutHours', 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
import colors from 'picocolors';
|
|
||||||
const executionProcess = config.getEnv('executions.process');
|
const executionProcess = config.getEnv('executions.process');
|
||||||
if (executionProcess) {
|
if (executionProcess) {
|
||||||
console.error(
|
console.error(
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import path from 'path';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
import convict from 'convict';
|
import convict from 'convict';
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { InstanceSettings } from 'n8n-core';
|
import { InstanceSettings } from 'n8n-core';
|
||||||
import { LOG_LEVELS } from 'n8n-workflow';
|
import { LOG_LEVELS } from 'n8n-workflow';
|
||||||
|
import path from 'path';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { ensureStringArray } from './utils';
|
import { ensureStringArray } from './utils';
|
||||||
import { GlobalConfig } from '@n8n/config';
|
|
||||||
|
|
||||||
convict.addFormat({
|
convict.addFormat({
|
||||||
name: 'comma-separated-list',
|
name: 'comma-separated-list',
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import type { BinaryData } from 'n8n-core';
|
|
||||||
import type { schema } from './schema';
|
|
||||||
import type { RedisOptions } from 'ioredis';
|
import type { RedisOptions } from 'ioredis';
|
||||||
|
import type { BinaryData } from 'n8n-core';
|
||||||
|
|
||||||
|
import type { schema } from './schema';
|
||||||
|
|
||||||
// -----------------------------------
|
// -----------------------------------
|
||||||
// transformers
|
// transformers
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import { NotStringArrayError } from '@/errors/not-string-array.error';
|
|
||||||
import type { SchemaObj } from 'convict';
|
import type { SchemaObj } from 'convict';
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
|
|
||||||
|
import { NotStringArrayError } from '@/errors/not-string-array.error';
|
||||||
|
|
||||||
export const ensureStringArray = (values: string[], { env }: SchemaObj<string>) => {
|
export const ensureStringArray = (values: string[], { env }: SchemaObj<string>) => {
|
||||||
if (!env) throw new ApplicationError('Missing env', { extra: { env } });
|
if (!env) throw new ApplicationError('Missing env', { extra: { env } });
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { readFileSync } from 'fs';
|
import { readFileSync } from 'fs';
|
||||||
import { resolve, join, dirname } from 'path';
|
|
||||||
import type { n8n } from 'n8n-core';
|
import type { n8n } from 'n8n-core';
|
||||||
import { jsonParse } from 'n8n-workflow';
|
import { jsonParse } from 'n8n-workflow';
|
||||||
|
import { resolve, join, dirname } from 'path';
|
||||||
|
|
||||||
const { NODE_ENV, E2E_TESTS } = process.env;
|
const { NODE_ENV, E2E_TESTS } = process.env;
|
||||||
export const inProduction = NODE_ENV === 'production';
|
export const inProduction = NODE_ENV === 'production';
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import type { Request } from 'express';
|
import type { Request } from 'express';
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
|
||||||
import { CurlController } from '@/controllers/curl.controller';
|
import { CurlController } from '@/controllers/curl.controller';
|
||||||
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import type { CurlService } from '@/services/curl.service';
|
import type { CurlService } from '@/services/curl.service';
|
||||||
|
|
||||||
describe('CurlController', () => {
|
describe('CurlController', () => {
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
|
import { mock } from 'jest-mock-extended';
|
||||||
|
import type { ILoadOptions, IWorkflowExecuteAdditionalData } from 'n8n-workflow';
|
||||||
|
|
||||||
import { DynamicNodeParametersController } from '@/controllers/dynamic-node-parameters.controller';
|
import { DynamicNodeParametersController } from '@/controllers/dynamic-node-parameters.controller';
|
||||||
import type { DynamicNodeParametersRequest } from '@/requests';
|
import type { DynamicNodeParametersRequest } from '@/requests';
|
||||||
import type { DynamicNodeParametersService } from '@/services/dynamic-node-parameters.service';
|
import type { DynamicNodeParametersService } from '@/services/dynamic-node-parameters.service';
|
||||||
import { mock } from 'jest-mock-extended';
|
|
||||||
import * as AdditionalData from '@/workflow-execute-additional-data';
|
import * as AdditionalData from '@/workflow-execute-additional-data';
|
||||||
import type { ILoadOptions, IWorkflowExecuteAdditionalData } from 'n8n-workflow';
|
|
||||||
|
|
||||||
describe('DynamicNodeParametersController', () => {
|
describe('DynamicNodeParametersController', () => {
|
||||||
const service = mock<DynamicNodeParametersService>();
|
const service = mock<DynamicNodeParametersService>();
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
import type { Response } from 'express';
|
import type { Response } from 'express';
|
||||||
import { Container } from 'typedi';
|
|
||||||
import jwt from 'jsonwebtoken';
|
|
||||||
import { mock, anyObject } from 'jest-mock-extended';
|
import { mock, anyObject } from 'jest-mock-extended';
|
||||||
|
import jwt from 'jsonwebtoken';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import type { PublicUser } from '@/interfaces';
|
|
||||||
import type { User } from '@/databases/entities/user';
|
|
||||||
import { API_KEY_PREFIX, MeController } from '@/controllers/me.controller';
|
|
||||||
import { AUTH_COOKIE_NAME } from '@/constants';
|
import { AUTH_COOKIE_NAME } from '@/constants';
|
||||||
import type { AuthenticatedRequest, MeRequest } from '@/requests';
|
import { API_KEY_PREFIX, MeController } from '@/controllers/me.controller';
|
||||||
import { UserService } from '@/services/user.service';
|
import type { User } from '@/databases/entities/user';
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { License } from '@/license';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
|
||||||
import { EventService } from '@/events/event.service';
|
|
||||||
import { badPasswords } from '@test/test-data';
|
|
||||||
import { mockInstance } from '@test/mocking';
|
|
||||||
import { AuthUserRepository } from '@/databases/repositories/auth-user.repository';
|
import { AuthUserRepository } from '@/databases/repositories/auth-user.repository';
|
||||||
import { InvalidAuthTokenRepository } from '@/databases/repositories/invalid-auth-token.repository';
|
import { InvalidAuthTokenRepository } from '@/databases/repositories/invalid-auth-token.repository';
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
import { MfaService } from '@/mfa/mfa.service';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { InvalidMfaCodeError } from '@/errors/response-errors/invalid-mfa-code.error';
|
import { InvalidMfaCodeError } from '@/errors/response-errors/invalid-mfa-code.error';
|
||||||
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import type { PublicUser } from '@/interfaces';
|
||||||
|
import { License } from '@/license';
|
||||||
|
import { MfaService } from '@/mfa/mfa.service';
|
||||||
|
import type { AuthenticatedRequest, MeRequest } from '@/requests';
|
||||||
|
import { UserService } from '@/services/user.service';
|
||||||
|
import { mockInstance } from '@test/mocking';
|
||||||
|
import { badPasswords } from '@test/test-data';
|
||||||
|
|
||||||
const browserId = 'test-browser-id';
|
const browserId = 'test-browser-id';
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import Container from 'typedi';
|
|
||||||
import type { Response } from 'express';
|
import type { Response } from 'express';
|
||||||
import { anyObject, mock } from 'jest-mock-extended';
|
import { anyObject, mock } from 'jest-mock-extended';
|
||||||
import jwt from 'jsonwebtoken';
|
import jwt from 'jsonwebtoken';
|
||||||
|
import Container from 'typedi';
|
||||||
|
|
||||||
import type { AuthService } from '@/auth/auth.service';
|
import type { AuthService } from '@/auth/auth.service';
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
|
@ -12,9 +12,8 @@ import type { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { License } from '@/license';
|
import { License } from '@/license';
|
||||||
import type { OwnerRequest } from '@/requests';
|
import type { OwnerRequest } from '@/requests';
|
||||||
import type { UserService } from '@/services/user.service';
|
|
||||||
import { PasswordUtility } from '@/services/password.utility';
|
import { PasswordUtility } from '@/services/password.utility';
|
||||||
|
import type { UserService } from '@/services/user.service';
|
||||||
import { mockInstance } from '@test/mocking';
|
import { mockInstance } from '@test/mocking';
|
||||||
import { badPasswords } from '@test/test-data';
|
import { badPasswords } from '@test/test-data';
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import type { TranslationRequest } from '@/controllers/translation.controller';
|
import type { TranslationRequest } from '@/controllers/translation.controller';
|
||||||
import {
|
import {
|
||||||
TranslationController,
|
TranslationController,
|
||||||
CREDENTIAL_TRANSLATIONS_DIR,
|
CREDENTIAL_TRANSLATIONS_DIR,
|
||||||
} from '@/controllers/translation.controller';
|
} from '@/controllers/translation.controller';
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
|
||||||
import type { CredentialTypes } from '@/credential-types';
|
import type { CredentialTypes } from '@/credential-types';
|
||||||
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
|
|
||||||
describe('TranslationController', () => {
|
describe('TranslationController', () => {
|
||||||
const configGetSpy = jest.spyOn(config, 'getEnv');
|
const configGetSpy = jest.spyOn(config, 'getEnv');
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
|
import { mock } from 'jest-mock-extended';
|
||||||
|
import type { NpsSurveyState } from 'n8n-workflow';
|
||||||
|
|
||||||
import { UserSettingsController } from '@/controllers/user-settings.controller';
|
import { UserSettingsController } from '@/controllers/user-settings.controller';
|
||||||
import type { NpsSurveyRequest } from '@/requests';
|
import type { NpsSurveyRequest } from '@/requests';
|
||||||
import type { UserService } from '@/services/user.service';
|
import type { UserService } from '@/services/user.service';
|
||||||
import { mock } from 'jest-mock-extended';
|
|
||||||
import type { NpsSurveyState } from 'n8n-workflow';
|
|
||||||
|
|
||||||
const NOW = 1717607016208;
|
const NOW = 1717607016208;
|
||||||
jest.useFakeTimers({
|
jest.useFakeTimers({
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
import { UsersController } from '../users.controller';
|
|
||||||
import type { UserRequest } from '@/requests';
|
|
||||||
import type { EventService } from '@/events/event.service';
|
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
import type { UserRepository } from '@/databases/repositories/user.repository';
|
import type { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
|
import type { EventService } from '@/events/event.service';
|
||||||
|
import type { UserRequest } from '@/requests';
|
||||||
import type { ProjectService } from '@/services/project.service';
|
import type { ProjectService } from '@/services/project.service';
|
||||||
|
|
||||||
|
import { UsersController } from '../users.controller';
|
||||||
|
|
||||||
describe('UsersController', () => {
|
describe('UsersController', () => {
|
||||||
const eventService = mock<EventService>();
|
const eventService = mock<EventService>();
|
||||||
const userRepository = mock<UserRepository>();
|
const userRepository = mock<UserRepository>();
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import type { Response } from 'express';
|
|
||||||
import type { AiAssistantSDK } from '@n8n_io/ai-assistant-sdk';
|
import type { AiAssistantSDK } from '@n8n_io/ai-assistant-sdk';
|
||||||
import { WritableStream } from 'node:stream/web';
|
import type { Response } from 'express';
|
||||||
import { strict as assert } from 'node:assert';
|
|
||||||
import { ErrorReporterProxy } from 'n8n-workflow';
|
import { ErrorReporterProxy } from 'n8n-workflow';
|
||||||
|
import { strict as assert } from 'node:assert';
|
||||||
|
import { WritableStream } from 'node:stream/web';
|
||||||
|
|
||||||
import { Post, RestController } from '@/decorators';
|
import { Post, RestController } from '@/decorators';
|
||||||
import { InternalServerError } from '@/errors/response-errors/internal-server.error';
|
import { InternalServerError } from '@/errors/response-errors/internal-server.error';
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { Delete, Get, Patch, Post, RestController, GlobalScope } from '@/decorators';
|
import { Delete, Get, Patch, Post, RestController, GlobalScope } from '@/decorators';
|
||||||
import { AnnotationTagService } from '@/services/annotation-tag.service';
|
|
||||||
import { AnnotationTagsRequest } from '@/requests';
|
import { AnnotationTagsRequest } from '@/requests';
|
||||||
|
import { AnnotationTagService } from '@/services/annotation-tag.service';
|
||||||
|
|
||||||
@RestController('/annotation-tags')
|
@RestController('/annotation-tags')
|
||||||
export class AnnotationTagsController {
|
export class AnnotationTagsController {
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
import validator from 'validator';
|
|
||||||
import { Response } from 'express';
|
import { Response } from 'express';
|
||||||
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
|
import validator from 'validator';
|
||||||
|
|
||||||
|
import { handleEmailLogin, handleLdapLogin } from '@/auth';
|
||||||
import { AuthService } from '@/auth/auth.service';
|
import { AuthService } from '@/auth/auth.service';
|
||||||
import { Get, Post, RestController } from '@/decorators';
|
|
||||||
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
import { AuthenticatedRequest, LoginRequest, UserRequest } from '@/requests';
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
|
import { Get, Post, RestController } from '@/decorators';
|
||||||
|
import { AuthError } from '@/errors/response-errors/auth.error';
|
||||||
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
|
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
||||||
|
import { EventService } from '@/events/event.service';
|
||||||
import type { PublicUser } from '@/interfaces';
|
import type { PublicUser } from '@/interfaces';
|
||||||
import { handleEmailLogin, handleLdapLogin } from '@/auth';
|
import { License } from '@/license';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { MfaService } from '@/mfa/mfa.service';
|
||||||
import { PostHogClient } from '@/posthog';
|
import { PostHogClient } from '@/posthog';
|
||||||
|
import { AuthenticatedRequest, LoginRequest, UserRequest } from '@/requests';
|
||||||
|
import { UserService } from '@/services/user.service';
|
||||||
import {
|
import {
|
||||||
getCurrentAuthenticationMethod,
|
getCurrentAuthenticationMethod,
|
||||||
isLdapCurrentAuthenticationMethod,
|
isLdapCurrentAuthenticationMethod,
|
||||||
isSamlCurrentAuthenticationMethod,
|
isSamlCurrentAuthenticationMethod,
|
||||||
} from '@/sso/sso-helpers';
|
} from '@/sso/sso-helpers';
|
||||||
import { License } from '@/license';
|
|
||||||
import { UserService } from '@/services/user.service';
|
|
||||||
import { MfaService } from '@/mfa/mfa.service';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { AuthError } from '@/errors/response-errors/auth.error';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
|
||||||
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
|
||||||
import { EventService } from '@/events/event.service';
|
|
||||||
|
|
||||||
@RestController()
|
@RestController()
|
||||||
export class AuthController {
|
export class AuthController {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
import { BinaryDataService, FileNotFoundError, isValidNonDefaultMode } from 'n8n-core';
|
import { BinaryDataService, FileNotFoundError, isValidNonDefaultMode } from 'n8n-core';
|
||||||
|
|
||||||
import { Get, RestController } from '@/decorators';
|
import { Get, RestController } from '@/decorators';
|
||||||
import { BinaryDataRequest } from '@/requests';
|
import { BinaryDataRequest } from '@/requests';
|
||||||
|
|
||||||
|
|
|
@ -3,15 +3,15 @@ import {
|
||||||
STARTER_TEMPLATE_NAME,
|
STARTER_TEMPLATE_NAME,
|
||||||
UNKNOWN_FAILURE_REASON,
|
UNKNOWN_FAILURE_REASON,
|
||||||
} from '@/constants';
|
} from '@/constants';
|
||||||
import { Delete, Get, Patch, Post, RestController, GlobalScope } from '@/decorators';
|
|
||||||
import { NodeRequest } from '@/requests';
|
|
||||||
import type { InstalledPackages } from '@/databases/entities/installed-packages';
|
import type { InstalledPackages } from '@/databases/entities/installed-packages';
|
||||||
import type { CommunityPackages } from '@/interfaces';
|
import { Delete, Get, Patch, Post, RestController, GlobalScope } from '@/decorators';
|
||||||
import { Push } from '@/push';
|
|
||||||
import { CommunityPackagesService } from '@/services/community-packages.service';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { InternalServerError } from '@/errors/response-errors/internal-server.error';
|
import { InternalServerError } from '@/errors/response-errors/internal-server.error';
|
||||||
import { EventService } from '@/events/event.service';
|
import { EventService } from '@/events/event.service';
|
||||||
|
import type { CommunityPackages } from '@/interfaces';
|
||||||
|
import { Push } from '@/push';
|
||||||
|
import { NodeRequest } from '@/requests';
|
||||||
|
import { CommunityPackagesService } from '@/services/community-packages.service';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
PACKAGE_NOT_INSTALLED,
|
PACKAGE_NOT_INSTALLED,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
|
|
||||||
import { Get, RestController } from '@/decorators';
|
import { Get, RestController } from '@/decorators';
|
||||||
import { AuthenticatedRequest } from '@/requests';
|
import { AuthenticatedRequest } from '@/requests';
|
||||||
import { CtaService } from '@/services/cta.service';
|
import { CtaService } from '@/services/cta.service';
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Request } from 'express';
|
import { Request } from 'express';
|
||||||
|
|
||||||
import { Post, RestController } from '@/decorators';
|
import { Post, RestController } from '@/decorators';
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { CurlService, flattenObject } from '@/services/curl.service';
|
import { CurlService, flattenObject } from '@/services/curl.service';
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Get, RestController } from '@/decorators';
|
|
||||||
import { ActiveWorkflowManager } from '@/active-workflow-manager';
|
import { ActiveWorkflowManager } from '@/active-workflow-manager';
|
||||||
import { OrchestrationService } from '@/services/orchestration.service';
|
|
||||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||||
|
import { Get, RestController } from '@/decorators';
|
||||||
|
import { OrchestrationService } from '@/services/orchestration.service';
|
||||||
|
|
||||||
@RestController('/debug')
|
@RestController('/debug')
|
||||||
export class DebugController {
|
export class DebugController {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import type { INodePropertyOptions, NodeParameterValueType } from 'n8n-workflow';
|
import type { INodePropertyOptions, NodeParameterValueType } from 'n8n-workflow';
|
||||||
|
|
||||||
import { Post, RestController } from '@/decorators';
|
import { Post, RestController } from '@/decorators';
|
||||||
import { getBase } from '@/workflow-execute-additional-data';
|
|
||||||
import { DynamicNodeParametersService } from '@/services/dynamic-node-parameters.service';
|
|
||||||
import { DynamicNodeParametersRequest } from '@/requests';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
|
import { DynamicNodeParametersRequest } from '@/requests';
|
||||||
|
import { DynamicNodeParametersService } from '@/services/dynamic-node-parameters.service';
|
||||||
|
import { getBase } from '@/workflow-execute-additional-data';
|
||||||
|
|
||||||
@RestController('/dynamic-node-parameters')
|
@RestController('/dynamic-node-parameters')
|
||||||
export class DynamicNodeParametersController {
|
export class DynamicNodeParametersController {
|
||||||
|
|
|
@ -1,22 +1,23 @@
|
||||||
import { Request } from 'express';
|
import { Request } from 'express';
|
||||||
|
import Container from 'typedi';
|
||||||
import { v4 as uuid } from 'uuid';
|
import { v4 as uuid } from 'uuid';
|
||||||
|
|
||||||
|
import { ActiveWorkflowManager } from '@/active-workflow-manager';
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
|
import { LICENSE_FEATURES, LICENSE_QUOTAS, UNLIMITED_LICENSE_QUOTA, inE2ETests } from '@/constants';
|
||||||
|
import { AuthUserRepository } from '@/databases/repositories/auth-user.repository';
|
||||||
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
import { ActiveWorkflowManager } from '@/active-workflow-manager';
|
|
||||||
import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus';
|
|
||||||
import { License } from '@/license';
|
|
||||||
import { LICENSE_FEATURES, LICENSE_QUOTAS, UNLIMITED_LICENSE_QUOTA, inE2ETests } from '@/constants';
|
|
||||||
import { Patch, Post, RestController } from '@/decorators';
|
import { Patch, Post, RestController } from '@/decorators';
|
||||||
import type { UserSetupPayload } from '@/requests';
|
import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus';
|
||||||
import type { BooleanLicenseFeature, IPushDataType, NumericLicenseFeature } from '@/interfaces';
|
import type { BooleanLicenseFeature, IPushDataType, NumericLicenseFeature } from '@/interfaces';
|
||||||
|
import { License } from '@/license';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
import { MfaService } from '@/mfa/mfa.service';
|
import { MfaService } from '@/mfa/mfa.service';
|
||||||
import { Push } from '@/push';
|
import { Push } from '@/push';
|
||||||
|
import type { UserSetupPayload } from '@/requests';
|
||||||
import { CacheService } from '@/services/cache/cache.service';
|
import { CacheService } from '@/services/cache/cache.service';
|
||||||
import { PasswordUtility } from '@/services/password.utility';
|
import { PasswordUtility } from '@/services/password.utility';
|
||||||
import Container from 'typedi';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { AuthUserRepository } from '@/databases/repositories/auth-user.repository';
|
|
||||||
|
|
||||||
if (!inE2ETests) {
|
if (!inE2ETests) {
|
||||||
Container.get(Logger).error('E2E endpoints only allowed during E2E tests');
|
Container.get(Logger).error('E2E endpoints only allowed during E2E tests');
|
||||||
|
|
|
@ -3,21 +3,21 @@ import validator from 'validator';
|
||||||
|
|
||||||
import { AuthService } from '@/auth/auth.service';
|
import { AuthService } from '@/auth/auth.service';
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import { Post, GlobalScope, RestController } from '@/decorators';
|
|
||||||
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
||||||
import { UserRequest } from '@/requests';
|
|
||||||
import { License } from '@/license';
|
|
||||||
import { UserService } from '@/services/user.service';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { isSamlLicensedAndEnabled } from '@/sso/saml/saml-helpers';
|
|
||||||
import { PasswordUtility } from '@/services/password.utility';
|
|
||||||
import { PostHogClient } from '@/posthog';
|
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
|
import { Post, GlobalScope, RestController } from '@/decorators';
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { EventService } from '@/events/event.service';
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import { License } from '@/license';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { PostHogClient } from '@/posthog';
|
||||||
|
import { UserRequest } from '@/requests';
|
||||||
|
import { PasswordUtility } from '@/services/password.utility';
|
||||||
|
import { UserService } from '@/services/user.service';
|
||||||
|
import { isSamlLicensedAndEnabled } from '@/sso/saml/saml-helpers';
|
||||||
|
|
||||||
@RestController('/invitations')
|
@RestController('/invitations')
|
||||||
export class InvitationController {
|
export class InvitationController {
|
||||||
|
|
|
@ -1,30 +1,31 @@
|
||||||
import validator from 'validator';
|
|
||||||
import { plainToInstance } from 'class-transformer';
|
import { plainToInstance } from 'class-transformer';
|
||||||
import { type RequestHandler, Response } from 'express';
|
|
||||||
import { randomBytes } from 'crypto';
|
import { randomBytes } from 'crypto';
|
||||||
|
import { type RequestHandler, Response } from 'express';
|
||||||
|
import validator from 'validator';
|
||||||
|
|
||||||
import { AuthService } from '@/auth/auth.service';
|
import { AuthService } from '@/auth/auth.service';
|
||||||
import { Delete, Get, Patch, Post, RestController } from '@/decorators';
|
|
||||||
import { PasswordUtility } from '@/services/password.utility';
|
|
||||||
import { validateEntity } from '@/generic-helpers';
|
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
|
import { Delete, Get, Patch, Post, RestController } from '@/decorators';
|
||||||
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
|
import { InvalidMfaCodeError } from '@/errors/response-errors/invalid-mfa-code.error';
|
||||||
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import { validateEntity } from '@/generic-helpers';
|
||||||
|
import type { PublicUser } from '@/interfaces';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { MfaService } from '@/mfa/mfa.service';
|
||||||
|
import { isApiEnabled } from '@/public-api';
|
||||||
import {
|
import {
|
||||||
AuthenticatedRequest,
|
AuthenticatedRequest,
|
||||||
MeRequest,
|
MeRequest,
|
||||||
UserSettingsUpdatePayload,
|
UserSettingsUpdatePayload,
|
||||||
UserUpdatePayload,
|
UserUpdatePayload,
|
||||||
} from '@/requests';
|
} from '@/requests';
|
||||||
import type { PublicUser } from '@/interfaces';
|
import { PasswordUtility } from '@/services/password.utility';
|
||||||
import { isSamlLicensedAndEnabled } from '@/sso/saml/saml-helpers';
|
|
||||||
import { UserService } from '@/services/user.service';
|
import { UserService } from '@/services/user.service';
|
||||||
import { Logger } from '@/logger';
|
import { isSamlLicensedAndEnabled } from '@/sso/saml/saml-helpers';
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
|
||||||
import { isApiEnabled } from '@/public-api';
|
|
||||||
import { EventService } from '@/events/event.service';
|
|
||||||
import { MfaService } from '@/mfa/mfa.service';
|
|
||||||
import { InvalidMfaCodeError } from '@/errors/response-errors/invalid-mfa-code.error';
|
|
||||||
import { PersonalizationSurveyAnswersV4 } from './survey-answers.dto';
|
import { PersonalizationSurveyAnswersV4 } from './survey-answers.dto';
|
||||||
|
|
||||||
export const API_KEY_PREFIX = 'n8n_api_';
|
export const API_KEY_PREFIX = 'n8n_api_';
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Get, Post, RestController } from '@/decorators';
|
import { Get, Post, RestController } from '@/decorators';
|
||||||
import { AuthenticatedRequest, MFA } from '@/requests';
|
|
||||||
import { MfaService } from '@/mfa/mfa.service';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
|
import { MfaService } from '@/mfa/mfa.service';
|
||||||
|
import { AuthenticatedRequest, MFA } from '@/requests';
|
||||||
|
|
||||||
@RestController('/mfa')
|
@RestController('/mfa')
|
||||||
export class MFAController {
|
export class MFAController {
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
|
import { Request } from 'express';
|
||||||
import { readFile } from 'fs/promises';
|
import { readFile } from 'fs/promises';
|
||||||
import get from 'lodash/get';
|
import get from 'lodash/get';
|
||||||
import { Request } from 'express';
|
|
||||||
import type { INodeTypeDescription, INodeTypeNameVersion } from 'n8n-workflow';
|
import type { INodeTypeDescription, INodeTypeNameVersion } from 'n8n-workflow';
|
||||||
import { Post, RestController } from '@/decorators';
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
|
import { Post, RestController } from '@/decorators';
|
||||||
import { NodeTypes } from '@/node-types';
|
import { NodeTypes } from '@/node-types';
|
||||||
|
|
||||||
@RestController('/node-types')
|
@RestController('/node-types')
|
||||||
|
|
|
@ -1,24 +1,23 @@
|
||||||
|
import Csrf from 'csrf';
|
||||||
|
import type { Response } from 'express';
|
||||||
|
import { mock } from 'jest-mock-extended';
|
||||||
|
import { Cipher } from 'n8n-core';
|
||||||
import nock from 'nock';
|
import nock from 'nock';
|
||||||
import Container from 'typedi';
|
import Container from 'typedi';
|
||||||
import type { Response } from 'express';
|
|
||||||
import Csrf from 'csrf';
|
|
||||||
import { Cipher } from 'n8n-core';
|
|
||||||
import { mock } from 'jest-mock-extended';
|
|
||||||
|
|
||||||
import { OAuth1CredentialController } from '@/controllers/oauth/oauth1-credential.controller';
|
import { OAuth1CredentialController } from '@/controllers/oauth/oauth1-credential.controller';
|
||||||
|
import { CredentialsHelper } from '@/credentials-helper';
|
||||||
import { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
import { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
import type { OAuthRequest } from '@/requests';
|
|
||||||
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { VariablesService } from '@/environments/variables/variables.service.ee';
|
import { VariablesService } from '@/environments/variables/variables.service.ee';
|
||||||
import { SecretsHelper } from '@/secrets-helpers';
|
|
||||||
import { CredentialsHelper } from '@/credentials-helper';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import type { OAuthRequest } from '@/requests';
|
||||||
|
import { SecretsHelper } from '@/secrets-helpers';
|
||||||
import { mockInstance } from '@test/mocking';
|
import { mockInstance } from '@test/mocking';
|
||||||
|
|
||||||
describe('OAuth1CredentialController', () => {
|
describe('OAuth1CredentialController', () => {
|
||||||
|
|
|
@ -1,24 +1,23 @@
|
||||||
import nock from 'nock';
|
|
||||||
import Container from 'typedi';
|
|
||||||
import Csrf from 'csrf';
|
import Csrf from 'csrf';
|
||||||
import { type Response } from 'express';
|
import { type Response } from 'express';
|
||||||
import { Cipher } from 'n8n-core';
|
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
|
import { Cipher } from 'n8n-core';
|
||||||
|
import nock from 'nock';
|
||||||
|
import Container from 'typedi';
|
||||||
|
|
||||||
import { OAuth2CredentialController } from '@/controllers/oauth/oauth2-credential.controller';
|
import { OAuth2CredentialController } from '@/controllers/oauth/oauth2-credential.controller';
|
||||||
|
import { CredentialsHelper } from '@/credentials-helper';
|
||||||
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
import type { OAuthRequest } from '@/requests';
|
|
||||||
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { VariablesService } from '@/environments/variables/variables.service.ee';
|
import { VariablesService } from '@/environments/variables/variables.service.ee';
|
||||||
import { SecretsHelper } from '@/secrets-helpers';
|
|
||||||
import { CredentialsHelper } from '@/credentials-helper';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import type { OAuthRequest } from '@/requests';
|
||||||
|
import { SecretsHelper } from '@/secrets-helpers';
|
||||||
import { mockInstance } from '@test/mocking';
|
import { mockInstance } from '@test/mocking';
|
||||||
|
|
||||||
describe('OAuth2CredentialController', () => {
|
describe('OAuth2CredentialController', () => {
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
import { Service } from 'typedi';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
import Csrf from 'csrf';
|
import Csrf from 'csrf';
|
||||||
import type { Response } from 'express';
|
import type { Response } from 'express';
|
||||||
import { Credentials } from 'n8n-core';
|
import { Credentials } from 'n8n-core';
|
||||||
import type { ICredentialDataDecryptedObject, IWorkflowExecuteAdditionalData } from 'n8n-workflow';
|
import type { ICredentialDataDecryptedObject, IWorkflowExecuteAdditionalData } from 'n8n-workflow';
|
||||||
import { jsonParse, ApplicationError } from 'n8n-workflow';
|
import { jsonParse, ApplicationError } from 'n8n-workflow';
|
||||||
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
|
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
||||||
|
import { CredentialsHelper } from '@/credentials-helper';
|
||||||
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
import type { ICredentialsDb } from '@/interfaces';
|
|
||||||
import type { OAuthRequest } from '@/requests';
|
|
||||||
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
|
||||||
import { CredentialsHelper } from '@/credentials-helper';
|
|
||||||
import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { UrlService } from '@/services/url.service';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
import { GlobalConfig } from '@n8n/config';
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import type { ICredentialsDb } from '@/interfaces';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import type { OAuthRequest } from '@/requests';
|
||||||
|
import { UrlService } from '@/services/url.service';
|
||||||
|
import * as WorkflowExecuteAdditionalData from '@/workflow-execute-additional-data';
|
||||||
|
|
||||||
export interface CsrfStateParam {
|
export interface CsrfStateParam {
|
||||||
cid: string;
|
cid: string;
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
import { Response } from 'express';
|
|
||||||
import type { AxiosRequestConfig } from 'axios';
|
import type { AxiosRequestConfig } from 'axios';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
import { createHmac } from 'crypto';
|
||||||
|
import { Response } from 'express';
|
||||||
import type { RequestOptions } from 'oauth-1.0a';
|
import type { RequestOptions } from 'oauth-1.0a';
|
||||||
import clientOAuth1 from 'oauth-1.0a';
|
import clientOAuth1 from 'oauth-1.0a';
|
||||||
import { createHmac } from 'crypto';
|
|
||||||
import { Get, RestController } from '@/decorators';
|
import { Get, RestController } from '@/decorators';
|
||||||
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
import { OAuthRequest } from '@/requests';
|
import { OAuthRequest } from '@/requests';
|
||||||
import { sendErrorResponse } from '@/response-helper';
|
import { sendErrorResponse } from '@/response-helper';
|
||||||
|
|
||||||
import { AbstractOAuthController, type CsrfStateParam } from './abstract-oauth.controller';
|
import { AbstractOAuthController, type CsrfStateParam } from './abstract-oauth.controller';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
|
||||||
|
|
||||||
interface OAuth1CredentialData {
|
interface OAuth1CredentialData {
|
||||||
signatureMethod: 'HMAC-SHA256' | 'HMAC-SHA512' | 'HMAC-SHA1';
|
signatureMethod: 'HMAC-SHA256' | 'HMAC-SHA512' | 'HMAC-SHA1';
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
import type { ClientOAuth2Options, OAuth2CredentialData } from '@n8n/client-oauth2';
|
import type { ClientOAuth2Options, OAuth2CredentialData } from '@n8n/client-oauth2';
|
||||||
import { ClientOAuth2 } from '@n8n/client-oauth2';
|
import { ClientOAuth2 } from '@n8n/client-oauth2';
|
||||||
import { Response } from 'express';
|
import { Response } from 'express';
|
||||||
import pkceChallenge from 'pkce-challenge';
|
|
||||||
import * as qs from 'querystring';
|
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
import set from 'lodash/set';
|
import set from 'lodash/set';
|
||||||
import split from 'lodash/split';
|
import split from 'lodash/split';
|
||||||
import { Get, RestController } from '@/decorators';
|
|
||||||
import { jsonStringify } from 'n8n-workflow';
|
import { jsonStringify } from 'n8n-workflow';
|
||||||
|
import pkceChallenge from 'pkce-challenge';
|
||||||
|
import * as qs from 'querystring';
|
||||||
|
|
||||||
|
import { Get, RestController } from '@/decorators';
|
||||||
import { OAuthRequest } from '@/requests';
|
import { OAuthRequest } from '@/requests';
|
||||||
|
|
||||||
import { AbstractOAuthController, type CsrfStateParam } from './abstract-oauth.controller';
|
import { AbstractOAuthController, type CsrfStateParam } from './abstract-oauth.controller';
|
||||||
import { GENERIC_OAUTH2_CREDENTIALS_WITH_EDITABLE_SCOPE as GENERIC_OAUTH2_CREDENTIALS_WITH_EDITABLE_SCOPE } from '../../constants';
|
import { GENERIC_OAUTH2_CREDENTIALS_WITH_EDITABLE_SCOPE as GENERIC_OAUTH2_CREDENTIALS_WITH_EDITABLE_SCOPE } from '../../constants';
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Post, RestController, GlobalScope } from '@/decorators';
|
import { Post, RestController, GlobalScope } from '@/decorators';
|
||||||
|
import { License } from '@/license';
|
||||||
import { OrchestrationRequest } from '@/requests';
|
import { OrchestrationRequest } from '@/requests';
|
||||||
import { OrchestrationService } from '@/services/orchestration.service';
|
import { OrchestrationService } from '@/services/orchestration.service';
|
||||||
import { License } from '@/license';
|
|
||||||
|
|
||||||
@RestController('/orchestration')
|
@RestController('/orchestration')
|
||||||
export class OrchestrationController {
|
export class OrchestrationController {
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
import validator from 'validator';
|
|
||||||
import { Response } from 'express';
|
import { Response } from 'express';
|
||||||
|
import validator from 'validator';
|
||||||
|
|
||||||
import { AuthService } from '@/auth/auth.service';
|
import { AuthService } from '@/auth/auth.service';
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import { validateEntity } from '@/generic-helpers';
|
|
||||||
import { GlobalScope, Post, RestController } from '@/decorators';
|
|
||||||
import { PasswordUtility } from '@/services/password.utility';
|
|
||||||
import { OwnerRequest } from '@/requests';
|
|
||||||
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
import { PostHogClient } from '@/posthog';
|
import { GlobalScope, Post, RestController } from '@/decorators';
|
||||||
import { UserService } from '@/services/user.service';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { EventService } from '@/events/event.service';
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { validateEntity } from '@/generic-helpers';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { PostHogClient } from '@/posthog';
|
||||||
|
import { OwnerRequest } from '@/requests';
|
||||||
|
import { PasswordUtility } from '@/services/password.utility';
|
||||||
|
import { UserService } from '@/services/user.service';
|
||||||
|
|
||||||
@RestController('/owner')
|
@RestController('/owner')
|
||||||
export class OwnerController {
|
export class OwnerController {
|
||||||
|
|
|
@ -2,24 +2,24 @@ import { Response } from 'express';
|
||||||
import validator from 'validator';
|
import validator from 'validator';
|
||||||
|
|
||||||
import { AuthService } from '@/auth/auth.service';
|
import { AuthService } from '@/auth/auth.service';
|
||||||
import { Get, Post, RestController } from '@/decorators';
|
|
||||||
import { PasswordUtility } from '@/services/password.utility';
|
|
||||||
import { UserManagementMailer } from '@/user-management/email';
|
|
||||||
import { PasswordResetRequest } from '@/requests';
|
|
||||||
import { isSamlCurrentAuthenticationMethod } from '@/sso/sso-helpers';
|
|
||||||
import { UserService } from '@/services/user.service';
|
|
||||||
import { License } from '@/license';
|
|
||||||
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
||||||
import { MfaService } from '@/mfa/mfa.service';
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
import { Logger } from '@/logger';
|
import { Get, Post, RestController } from '@/decorators';
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { InternalServerError } from '@/errors/response-errors/internal-server.error';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
||||||
|
import { InternalServerError } from '@/errors/response-errors/internal-server.error';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
import { UnprocessableRequestError } from '@/errors/response-errors/unprocessable.error';
|
import { UnprocessableRequestError } from '@/errors/response-errors/unprocessable.error';
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
|
||||||
import { EventService } from '@/events/event.service';
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import { License } from '@/license';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { MfaService } from '@/mfa/mfa.service';
|
||||||
|
import { PasswordResetRequest } from '@/requests';
|
||||||
|
import { PasswordUtility } from '@/services/password.utility';
|
||||||
|
import { UserService } from '@/services/user.service';
|
||||||
|
import { isSamlCurrentAuthenticationMethod } from '@/sso/sso-helpers';
|
||||||
|
import { UserManagementMailer } from '@/user-management/email';
|
||||||
|
|
||||||
@RestController()
|
@RestController()
|
||||||
export class PasswordResetController {
|
export class PasswordResetController {
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
|
import { combineScopes } from '@n8n/permissions';
|
||||||
|
import type { Scope } from '@n8n/permissions';
|
||||||
|
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
||||||
|
import { In, Not } from '@n8n/typeorm';
|
||||||
|
|
||||||
import type { Project } from '@/databases/entities/project';
|
import type { Project } from '@/databases/entities/project';
|
||||||
|
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
||||||
import {
|
import {
|
||||||
Get,
|
Get,
|
||||||
Post,
|
Post,
|
||||||
|
@ -9,21 +15,16 @@ import {
|
||||||
ProjectScope,
|
ProjectScope,
|
||||||
Delete,
|
Delete,
|
||||||
} from '@/decorators';
|
} from '@/decorators';
|
||||||
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
|
import { EventService } from '@/events/event.service';
|
||||||
import { ProjectRequest } from '@/requests';
|
import { ProjectRequest } from '@/requests';
|
||||||
import {
|
import {
|
||||||
ProjectService,
|
ProjectService,
|
||||||
TeamProjectOverQuotaError,
|
TeamProjectOverQuotaError,
|
||||||
UnlicensedProjectRoleError,
|
UnlicensedProjectRoleError,
|
||||||
} from '@/services/project.service';
|
} from '@/services/project.service';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
|
||||||
import { combineScopes } from '@n8n/permissions';
|
|
||||||
import type { Scope } from '@n8n/permissions';
|
|
||||||
import { RoleService } from '@/services/role.service';
|
import { RoleService } from '@/services/role.service';
|
||||||
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
|
||||||
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
|
||||||
import { In, Not } from '@n8n/typeorm';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
|
||||||
import { EventService } from '@/events/event.service';
|
|
||||||
|
|
||||||
@RestController('/projects')
|
@RestController('/projects')
|
||||||
export class ProjectController {
|
export class ProjectController {
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import { NoXss } from '@/validators/no-xss.validator';
|
|
||||||
import { Expose } from 'class-transformer';
|
import { Expose } from 'class-transformer';
|
||||||
import { IsString, IsArray, IsOptional, IsEmail, IsEnum } from 'class-validator';
|
import { IsString, IsArray, IsOptional, IsEmail, IsEnum } from 'class-validator';
|
||||||
import type { IPersonalizationSurveyAnswersV4 } from 'n8n-workflow';
|
import type { IPersonalizationSurveyAnswersV4 } from 'n8n-workflow';
|
||||||
|
|
||||||
|
import { NoXss } from '@/validators/no-xss.validator';
|
||||||
|
|
||||||
export class PersonalizationSurveyAnswersV4 implements IPersonalizationSurveyAnswersV4 {
|
export class PersonalizationSurveyAnswersV4 implements IPersonalizationSurveyAnswersV4 {
|
||||||
@NoXss()
|
@NoXss()
|
||||||
@Expose()
|
@Expose()
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import { Request, Response, NextFunction } from 'express';
|
import { Request, Response, NextFunction } from 'express';
|
||||||
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import { Delete, Get, Middleware, Patch, Post, RestController, GlobalScope } from '@/decorators';
|
import { Delete, Get, Middleware, Patch, Post, RestController, GlobalScope } from '@/decorators';
|
||||||
import { TagService } from '@/services/tag.service';
|
|
||||||
import { TagsRequest } from '@/requests';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
|
import { TagsRequest } from '@/requests';
|
||||||
|
import { TagService } from '@/services/tag.service';
|
||||||
|
|
||||||
@RestController('/tags')
|
@RestController('/tags')
|
||||||
export class TagsController {
|
export class TagsController {
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
import type { Request } from 'express';
|
import type { Request } from 'express';
|
||||||
import { join } from 'path';
|
|
||||||
import { access } from 'fs/promises';
|
import { access } from 'fs/promises';
|
||||||
import { Get, RestController } from '@/decorators';
|
import { join } from 'path';
|
||||||
|
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import { NODES_BASE_DIR } from '@/constants';
|
import { NODES_BASE_DIR } from '@/constants';
|
||||||
|
import { CredentialTypes } from '@/credential-types';
|
||||||
|
import { Get, RestController } from '@/decorators';
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { InternalServerError } from '@/errors/response-errors/internal-server.error';
|
import { InternalServerError } from '@/errors/response-errors/internal-server.error';
|
||||||
import { CredentialTypes } from '@/credential-types';
|
|
||||||
|
|
||||||
export const CREDENTIAL_TRANSLATIONS_DIR = 'n8n-nodes-base/dist/credentials/translations';
|
export const CREDENTIAL_TRANSLATIONS_DIR = 'n8n-nodes-base/dist/credentials/translations';
|
||||||
export const NODE_HEADERS_PATH = join(NODES_BASE_DIR, 'dist/nodes/headers');
|
export const NODE_HEADERS_PATH = join(NODES_BASE_DIR, 'dist/nodes/headers');
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
|
import type { NpsSurveyState } from 'n8n-workflow';
|
||||||
|
|
||||||
import { Patch, RestController } from '@/decorators';
|
import { Patch, RestController } from '@/decorators';
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { NpsSurveyRequest } from '@/requests';
|
import { NpsSurveyRequest } from '@/requests';
|
||||||
import { UserService } from '@/services/user.service';
|
import { UserService } from '@/services/user.service';
|
||||||
import type { NpsSurveyState } from 'n8n-workflow';
|
|
||||||
|
|
||||||
function getNpsSurveyState(state: unknown): NpsSurveyState | undefined {
|
function getNpsSurveyState(state: unknown): NpsSurveyState | undefined {
|
||||||
if (typeof state !== 'object' || state === null) {
|
if (typeof state !== 'object' || state === null) {
|
||||||
|
|
|
@ -1,33 +1,33 @@
|
||||||
import { plainToInstance } from 'class-transformer';
|
import { plainToInstance } from 'class-transformer';
|
||||||
|
|
||||||
import { AuthService } from '@/auth/auth.service';
|
import { AuthService } from '@/auth/auth.service';
|
||||||
|
import { CredentialsService } from '@/credentials/credentials.service';
|
||||||
|
import { AuthIdentity } from '@/databases/entities/auth-identity';
|
||||||
|
import { Project } from '@/databases/entities/project';
|
||||||
import { User } from '@/databases/entities/user';
|
import { User } from '@/databases/entities/user';
|
||||||
|
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
||||||
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
|
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
||||||
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
import { GlobalScope, Delete, Get, RestController, Patch, Licensed } from '@/decorators';
|
import { GlobalScope, Delete, Get, RestController, Patch, Licensed } from '@/decorators';
|
||||||
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
|
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
||||||
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
|
import { validateEntity } from '@/generic-helpers';
|
||||||
|
import type { PublicUser } from '@/interfaces';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { listQueryMiddleware } from '@/middlewares';
|
||||||
import {
|
import {
|
||||||
ListQuery,
|
ListQuery,
|
||||||
UserRequest,
|
UserRequest,
|
||||||
UserRoleChangePayload,
|
UserRoleChangePayload,
|
||||||
UserSettingsUpdatePayload,
|
UserSettingsUpdatePayload,
|
||||||
} from '@/requests';
|
} from '@/requests';
|
||||||
import type { PublicUser } from '@/interfaces';
|
|
||||||
import { AuthIdentity } from '@/databases/entities/auth-identity';
|
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
|
||||||
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
|
||||||
import { UserService } from '@/services/user.service';
|
|
||||||
import { listQueryMiddleware } from '@/middlewares';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import { validateEntity } from '@/generic-helpers';
|
|
||||||
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
|
||||||
import { Project } from '@/databases/entities/project';
|
|
||||||
import { WorkflowService } from '@/workflows/workflow.service';
|
|
||||||
import { CredentialsService } from '@/credentials/credentials.service';
|
|
||||||
import { ProjectService } from '@/services/project.service';
|
import { ProjectService } from '@/services/project.service';
|
||||||
import { EventService } from '@/events/event.service';
|
import { UserService } from '@/services/user.service';
|
||||||
|
import { WorkflowService } from '@/workflows/workflow.service';
|
||||||
|
|
||||||
@RestController('/users')
|
@RestController('/users')
|
||||||
export class UsersController {
|
export class UsersController {
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
import { Response, NextFunction } from 'express';
|
import { Response, NextFunction } from 'express';
|
||||||
import { Get, Middleware, RestController } from '@/decorators';
|
|
||||||
import type { WorkflowStatistics } from '@/databases/entities/workflow-statistics';
|
import type { WorkflowStatistics } from '@/databases/entities/workflow-statistics';
|
||||||
import { StatisticsNames } from '@/databases/entities/workflow-statistics';
|
import { StatisticsNames } from '@/databases/entities/workflow-statistics';
|
||||||
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
import { SharedWorkflowRepository } from '@/databases/repositories/shared-workflow.repository';
|
||||||
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflow-statistics.repository';
|
import { WorkflowStatisticsRepository } from '@/databases/repositories/workflow-statistics.repository';
|
||||||
|
import { Get, Middleware, RestController } from '@/decorators';
|
||||||
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
import type { IWorkflowStatisticsDataLoaded } from '@/interfaces';
|
import type { IWorkflowStatisticsDataLoaded } from '@/interfaces';
|
||||||
import { Logger } from '@/logger';
|
import { Logger } from '@/logger';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
|
||||||
import { StatisticsRequest } from './workflow-statistics.types';
|
import { StatisticsRequest } from './workflow-statistics.types';
|
||||||
|
|
||||||
interface WorkflowStatisticsData<T> {
|
interface WorkflowStatisticsData<T> {
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import { existsSync } from 'fs';
|
import { existsSync } from 'fs';
|
||||||
import { mkdir, utimes, open, rm } from 'fs/promises';
|
import { mkdir, utimes, open, rm } from 'fs/promises';
|
||||||
import { join, dirname } from 'path';
|
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { InstanceSettings } from 'n8n-core';
|
import { InstanceSettings } from 'n8n-core';
|
||||||
import { sleep } from 'n8n-workflow';
|
import { sleep } from 'n8n-workflow';
|
||||||
|
import { join, dirname } from 'path';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { inProduction } from '@/constants';
|
import { inProduction } from '@/constants';
|
||||||
import { Logger } from '@/logger';
|
import { Logger } from '@/logger';
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import { Service } from 'typedi';
|
|
||||||
import { loadClassInIsolation } from 'n8n-core';
|
import { loadClassInIsolation } from 'n8n-core';
|
||||||
import {
|
import {
|
||||||
ApplicationError,
|
ApplicationError,
|
||||||
|
@ -6,6 +5,8 @@ import {
|
||||||
type ICredentialTypes,
|
type ICredentialTypes,
|
||||||
type LoadedClass,
|
type LoadedClass,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
|
||||||
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||||
import { Service } from 'typedi';
|
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
||||||
|
import { In } from '@n8n/typeorm';
|
||||||
import { Credentials, NodeExecuteFunctions } from 'n8n-core';
|
import { Credentials, NodeExecuteFunctions } from 'n8n-core';
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
ICredentialDataDecryptedObject,
|
ICredentialDataDecryptedObject,
|
||||||
ICredentialsExpressionResolveValues,
|
ICredentialsExpressionResolveValues,
|
||||||
|
@ -26,19 +26,17 @@ import type {
|
||||||
IDataObject,
|
IDataObject,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
import { ICredentialsHelper, NodeHelpers, Workflow, ApplicationError } from 'n8n-workflow';
|
import { ICredentialsHelper, NodeHelpers, Workflow, ApplicationError } from 'n8n-workflow';
|
||||||
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
import type { ICredentialsDb } from '@/interfaces';
|
|
||||||
|
|
||||||
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
|
||||||
import { CredentialTypes } from '@/credential-types';
|
import { CredentialTypes } from '@/credential-types';
|
||||||
import { CredentialsOverwrites } from '@/credentials-overwrites';
|
import { CredentialsOverwrites } from '@/credentials-overwrites';
|
||||||
import { RESPONSE_ERROR_MESSAGES } from './constants';
|
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
|
|
||||||
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
|
import type { ICredentialsDb } from '@/interfaces';
|
||||||
|
|
||||||
|
import { RESPONSE_ERROR_MESSAGES } from './constants';
|
||||||
import { CredentialNotFoundError } from './errors/credential-not-found.error';
|
import { CredentialNotFoundError } from './errors/credential-not-found.error';
|
||||||
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
|
||||||
import { In } from '@n8n/typeorm';
|
|
||||||
import { CacheService } from './services/cache/cache.service';
|
import { CacheService } from './services/cache/cache.service';
|
||||||
|
|
||||||
const mockNode = {
|
const mockNode = {
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import { Service } from 'typedi';
|
|
||||||
import { GlobalConfig } from '@n8n/config';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
import type { ICredentialDataDecryptedObject } from 'n8n-workflow';
|
import type { ICredentialDataDecryptedObject } from 'n8n-workflow';
|
||||||
import { deepCopy, jsonParse } from 'n8n-workflow';
|
import { deepCopy, jsonParse } from 'n8n-workflow';
|
||||||
import type { ICredentialsOverwrite } from '@/interfaces';
|
import { Service } from 'typedi';
|
||||||
|
|
||||||
import { CredentialTypes } from '@/credential-types';
|
import { CredentialTypes } from '@/credential-types';
|
||||||
|
import type { ICredentialsOverwrite } from '@/interfaces';
|
||||||
import { Logger } from '@/logger';
|
import { Logger } from '@/logger';
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import { CREDENTIAL_EMPTY_VALUE, type ICredentialType } from 'n8n-workflow';
|
|
||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
|
import { CREDENTIAL_EMPTY_VALUE, type ICredentialType } from 'n8n-workflow';
|
||||||
|
|
||||||
import { CREDENTIAL_BLANKING_VALUE } from '@/constants';
|
import { CREDENTIAL_BLANKING_VALUE } from '@/constants';
|
||||||
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
|
||||||
import type { CredentialTypes } from '@/credential-types';
|
import type { CredentialTypes } from '@/credential-types';
|
||||||
import { CredentialsService } from '@/credentials/credentials.service';
|
import { CredentialsService } from '@/credentials/credentials.service';
|
||||||
|
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
|
|
||||||
describe('CredentialsService', () => {
|
describe('CredentialsService', () => {
|
||||||
const credType = mock<ICredentialType>({
|
const credType = mock<ICredentialType>({
|
||||||
|
|
|
@ -1,16 +1,13 @@
|
||||||
import { deepCopy } from 'n8n-workflow';
|
|
||||||
import { GlobalConfig } from '@n8n/config';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
||||||
import { In } from '@n8n/typeorm';
|
import { In } from '@n8n/typeorm';
|
||||||
|
import { deepCopy } from 'n8n-workflow';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
import { CredentialsService } from './credentials.service';
|
import { SharedCredentials } from '@/databases/entities/shared-credentials';
|
||||||
import { CredentialRequest } from '@/requests';
|
import { ProjectRelationRepository } from '@/databases/repositories/project-relation.repository';
|
||||||
import { Logger } from '@/logger';
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
import * as Db from '@/db';
|
||||||
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
|
||||||
import { NamingService } from '@/services/naming.service';
|
|
||||||
import { License } from '@/license';
|
|
||||||
import { EnterpriseCredentialsService } from './credentials.service.ee';
|
|
||||||
import {
|
import {
|
||||||
Delete,
|
Delete,
|
||||||
Get,
|
Get,
|
||||||
|
@ -22,15 +19,19 @@ import {
|
||||||
ProjectScope,
|
ProjectScope,
|
||||||
} from '@/decorators';
|
} from '@/decorators';
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { UserManagementMailer } from '@/user-management/email';
|
import { ForbiddenError } from '@/errors/response-errors/forbidden.error';
|
||||||
import * as Db from '@/db';
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
import * as utils from '@/utils';
|
|
||||||
import { listQueryMiddleware } from '@/middlewares';
|
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
|
||||||
import { SharedCredentials } from '@/databases/entities/shared-credentials';
|
|
||||||
import { ProjectRelationRepository } from '@/databases/repositories/project-relation.repository';
|
|
||||||
import { z } from 'zod';
|
|
||||||
import { EventService } from '@/events/event.service';
|
import { EventService } from '@/events/event.service';
|
||||||
|
import { License } from '@/license';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
|
import { listQueryMiddleware } from '@/middlewares';
|
||||||
|
import { CredentialRequest } from '@/requests';
|
||||||
|
import { NamingService } from '@/services/naming.service';
|
||||||
|
import { UserManagementMailer } from '@/user-management/email';
|
||||||
|
import * as utils from '@/utils';
|
||||||
|
|
||||||
|
import { CredentialsService } from './credentials.service';
|
||||||
|
import { EnterpriseCredentialsService } from './credentials.service.ee';
|
||||||
|
|
||||||
@RestController('/credentials')
|
@RestController('/credentials')
|
||||||
export class CredentialsController {
|
export class CredentialsController {
|
||||||
|
|
|
@ -1,19 +1,21 @@
|
||||||
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
||||||
import { In, type EntityManager } from '@n8n/typeorm';
|
import { In, type EntityManager } from '@n8n/typeorm';
|
||||||
import type { User } from '@/databases/entities/user';
|
|
||||||
import { CredentialsService } from './credentials.service';
|
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
|
||||||
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
|
||||||
import { Service } from 'typedi';
|
|
||||||
import type { ICredentialDataDecryptedObject } from 'n8n-workflow';
|
import type { ICredentialDataDecryptedObject } from 'n8n-workflow';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
import { Service } from 'typedi';
|
||||||
import { OwnershipService } from '@/services/ownership.service';
|
|
||||||
|
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
import { Project } from '@/databases/entities/project';
|
import { Project } from '@/databases/entities/project';
|
||||||
import { ProjectService } from '@/services/project.service';
|
|
||||||
import { TransferCredentialError } from '@/errors/response-errors/transfer-credential.error';
|
|
||||||
import { SharedCredentials } from '@/databases/entities/shared-credentials';
|
import { SharedCredentials } from '@/databases/entities/shared-credentials';
|
||||||
|
import type { User } from '@/databases/entities/user';
|
||||||
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
|
import { TransferCredentialError } from '@/errors/response-errors/transfer-credential.error';
|
||||||
|
import { OwnershipService } from '@/services/ownership.service';
|
||||||
|
import { ProjectService } from '@/services/project.service';
|
||||||
import { RoleService } from '@/services/role.service';
|
import { RoleService } from '@/services/role.service';
|
||||||
|
|
||||||
|
import { CredentialsService } from './credentials.service';
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class EnterpriseCredentialsService {
|
export class EnterpriseCredentialsService {
|
||||||
constructor(
|
constructor(
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
import type { Scope } from '@n8n/permissions';
|
||||||
|
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
||||||
|
import {
|
||||||
|
In,
|
||||||
|
type EntityManager,
|
||||||
|
type FindOptionsRelations,
|
||||||
|
type FindOptionsWhere,
|
||||||
|
} from '@n8n/typeorm';
|
||||||
import { Credentials } from 'n8n-core';
|
import { Credentials } from 'n8n-core';
|
||||||
import type {
|
import type {
|
||||||
ICredentialDataDecryptedObject,
|
ICredentialDataDecryptedObject,
|
||||||
|
@ -6,39 +14,32 @@ import type {
|
||||||
INodeProperties,
|
INodeProperties,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
import { ApplicationError, CREDENTIAL_EMPTY_VALUE, deepCopy, NodeHelpers } from 'n8n-workflow';
|
import { ApplicationError, CREDENTIAL_EMPTY_VALUE, deepCopy, NodeHelpers } from 'n8n-workflow';
|
||||||
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
|
|
||||||
import {
|
|
||||||
In,
|
|
||||||
type EntityManager,
|
|
||||||
type FindOptionsRelations,
|
|
||||||
type FindOptionsWhere,
|
|
||||||
} from '@n8n/typeorm';
|
|
||||||
import type { Scope } from '@n8n/permissions';
|
|
||||||
import * as Db from '@/db';
|
|
||||||
import type { ICredentialsDb } from '@/interfaces';
|
|
||||||
import { createCredentialsFromCredentialsEntity } from '@/credentials-helper';
|
|
||||||
import { CREDENTIAL_BLANKING_VALUE } from '@/constants';
|
|
||||||
import { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
|
||||||
import { SharedCredentials } from '@/databases/entities/shared-credentials';
|
|
||||||
import { validateEntity } from '@/generic-helpers';
|
|
||||||
import { ExternalHooks } from '@/external-hooks';
|
|
||||||
import type { User } from '@/databases/entities/user';
|
|
||||||
import type { CredentialRequest, ListQuery } from '@/requests';
|
|
||||||
import { CredentialTypes } from '@/credential-types';
|
|
||||||
import { OwnershipService } from '@/services/ownership.service';
|
|
||||||
import { Logger } from '@/logger';
|
|
||||||
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
|
||||||
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
|
||||||
import { Service } from 'typedi';
|
import { Service } from 'typedi';
|
||||||
import { CredentialsTester } from '@/services/credentials-tester.service';
|
|
||||||
|
import { CREDENTIAL_BLANKING_VALUE } from '@/constants';
|
||||||
|
import { CredentialTypes } from '@/credential-types';
|
||||||
|
import { createCredentialsFromCredentialsEntity } from '@/credentials-helper';
|
||||||
|
import { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
|
import type { ProjectRelation } from '@/databases/entities/project-relation';
|
||||||
|
import { SharedCredentials } from '@/databases/entities/shared-credentials';
|
||||||
|
import type { User } from '@/databases/entities/user';
|
||||||
|
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
|
||||||
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
import { ProjectRepository } from '@/databases/repositories/project.repository';
|
||||||
import { ProjectService } from '@/services/project.service';
|
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
|
||||||
|
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||||
|
import * as Db from '@/db';
|
||||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||||
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||||
import type { ProjectRelation } from '@/databases/entities/project-relation';
|
import { ExternalHooks } from '@/external-hooks';
|
||||||
import { RoleService } from '@/services/role.service';
|
import { validateEntity } from '@/generic-helpers';
|
||||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
import type { ICredentialsDb } from '@/interfaces';
|
||||||
|
import { Logger } from '@/logger';
|
||||||
import { userHasScope } from '@/permissions/check-access';
|
import { userHasScope } from '@/permissions/check-access';
|
||||||
|
import type { CredentialRequest, ListQuery } from '@/requests';
|
||||||
|
import { CredentialsTester } from '@/services/credentials-tester.service';
|
||||||
|
import { OwnershipService } from '@/services/ownership.service';
|
||||||
|
import { ProjectService } from '@/services/project.service';
|
||||||
|
import { RoleService } from '@/services/role.service';
|
||||||
|
|
||||||
export type CredentialsGetSharedOptions =
|
export type CredentialsGetSharedOptions =
|
||||||
| { allowGlobalScope: true; globalScope: Scope }
|
| { allowGlobalScope: true; globalScope: Scope }
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
import path from 'path';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
import { Container } from 'typedi';
|
|
||||||
import type { TlsOptions } from 'tls';
|
|
||||||
import type { DataSourceOptions, LoggerOptions } from '@n8n/typeorm';
|
import type { DataSourceOptions, LoggerOptions } from '@n8n/typeorm';
|
||||||
|
import type { MysqlConnectionOptions } from '@n8n/typeorm/driver/mysql/MysqlConnectionOptions';
|
||||||
|
import type { PostgresConnectionOptions } from '@n8n/typeorm/driver/postgres/PostgresConnectionOptions';
|
||||||
import type { SqliteConnectionOptions } from '@n8n/typeorm/driver/sqlite/SqliteConnectionOptions';
|
import type { SqliteConnectionOptions } from '@n8n/typeorm/driver/sqlite/SqliteConnectionOptions';
|
||||||
import type { SqlitePooledConnectionOptions } from '@n8n/typeorm/driver/sqlite-pooled/SqlitePooledConnectionOptions';
|
import type { SqlitePooledConnectionOptions } from '@n8n/typeorm/driver/sqlite-pooled/SqlitePooledConnectionOptions';
|
||||||
import type { PostgresConnectionOptions } from '@n8n/typeorm/driver/postgres/PostgresConnectionOptions';
|
|
||||||
import type { MysqlConnectionOptions } from '@n8n/typeorm/driver/mysql/MysqlConnectionOptions';
|
|
||||||
import { InstanceSettings } from 'n8n-core';
|
import { InstanceSettings } from 'n8n-core';
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
import { GlobalConfig } from '@n8n/config';
|
import path from 'path';
|
||||||
|
import type { TlsOptions } from 'tls';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { entities } from './entities';
|
import { entities } from './entities';
|
||||||
import { subscribers } from './subscribers';
|
|
||||||
import { mysqlMigrations } from './migrations/mysqldb';
|
import { mysqlMigrations } from './migrations/mysqldb';
|
||||||
import { postgresMigrations } from './migrations/postgresdb';
|
import { postgresMigrations } from './migrations/postgresdb';
|
||||||
import { sqliteMigrations } from './migrations/sqlite';
|
import { sqliteMigrations } from './migrations/sqlite';
|
||||||
|
import { subscribers } from './subscribers';
|
||||||
|
|
||||||
const getCommonOptions = () => {
|
const getCommonOptions = () => {
|
||||||
const { tablePrefix: entityPrefix, logging: loggingConfig } =
|
const { tablePrefix: entityPrefix, logging: loggingConfig } =
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import type { QueryRunner } from '@n8n/typeorm';
|
import type { QueryRunner } from '@n8n/typeorm';
|
||||||
|
|
||||||
import { Column } from './column';
|
import { Column } from './column';
|
||||||
|
import { CreateIndex, DropIndex } from './indices';
|
||||||
import {
|
import {
|
||||||
AddColumns,
|
AddColumns,
|
||||||
AddForeignKey,
|
AddForeignKey,
|
||||||
|
@ -10,7 +12,6 @@ import {
|
||||||
DropNotNull,
|
DropNotNull,
|
||||||
DropTable,
|
DropTable,
|
||||||
} from './table';
|
} from './table';
|
||||||
import { CreateIndex, DropIndex } from './indices';
|
|
||||||
|
|
||||||
export const createSchemaBuilder = (tablePrefix: string, queryRunner: QueryRunner) => ({
|
export const createSchemaBuilder = (tablePrefix: string, queryRunner: QueryRunner) => ({
|
||||||
column: (name: string) => new Column(name),
|
column: (name: string) => new Column(name),
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import type { TableForeignKeyOptions, TableIndexOptions, QueryRunner } from '@n8n/typeorm';
|
import type { TableForeignKeyOptions, TableIndexOptions, QueryRunner } from '@n8n/typeorm';
|
||||||
import { Table, TableColumn, TableForeignKey } from '@n8n/typeorm';
|
import { Table, TableColumn, TableForeignKey } from '@n8n/typeorm';
|
||||||
import LazyPromise from 'p-lazy';
|
|
||||||
import { Column } from './column';
|
|
||||||
import { ApplicationError } from 'n8n-workflow';
|
import { ApplicationError } from 'n8n-workflow';
|
||||||
|
import LazyPromise from 'p-lazy';
|
||||||
|
|
||||||
|
import { Column } from './column';
|
||||||
|
|
||||||
abstract class TableOperation<R = void> extends LazyPromise<R> {
|
abstract class TableOperation<R = void> extends LazyPromise<R> {
|
||||||
abstract execute(queryRunner: QueryRunner): Promise<R>;
|
abstract execute(queryRunner: QueryRunner): Promise<R>;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import { Container } from 'typedi';
|
|
||||||
import { GlobalConfig } from '@n8n/config';
|
import { GlobalConfig } from '@n8n/config';
|
||||||
import type { ColumnOptions } from '@n8n/typeorm';
|
import type { ColumnOptions } from '@n8n/typeorm';
|
||||||
import {
|
import {
|
||||||
|
@ -9,6 +8,8 @@ import {
|
||||||
UpdateDateColumn,
|
UpdateDateColumn,
|
||||||
} from '@n8n/typeorm';
|
} from '@n8n/typeorm';
|
||||||
import type { Class } from 'n8n-core';
|
import type { Class } from 'n8n-core';
|
||||||
|
import { Container } from 'typedi';
|
||||||
|
|
||||||
import { generateNanoId } from '../utils/generators';
|
import { generateNanoId } from '../utils/generators';
|
||||||
|
|
||||||
export const { type: dbType } = Container.get(GlobalConfig).database;
|
export const { type: dbType } = Container.get(GlobalConfig).database;
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
import { Column, Entity, Index, ManyToMany, OneToMany } from '@n8n/typeorm';
|
import { Column, Entity, Index, ManyToMany, OneToMany } from '@n8n/typeorm';
|
||||||
import { IsString, Length } from 'class-validator';
|
import { IsString, Length } from 'class-validator';
|
||||||
import { WithTimestampsAndStringId } from './abstract-entity';
|
|
||||||
import type { ExecutionAnnotation } from '@/databases/entities/execution-annotation';
|
|
||||||
import type { AnnotationTagMapping } from '@/databases/entities/annotation-tag-mapping';
|
import type { AnnotationTagMapping } from '@/databases/entities/annotation-tag-mapping';
|
||||||
|
import type { ExecutionAnnotation } from '@/databases/entities/execution-annotation';
|
||||||
|
|
||||||
|
import { WithTimestampsAndStringId } from './abstract-entity';
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class AnnotationTagEntity extends WithTimestampsAndStringId {
|
export class AnnotationTagEntity extends WithTimestampsAndStringId {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { Entity, JoinColumn, ManyToOne, PrimaryColumn } from '@n8n/typeorm';
|
import { Entity, JoinColumn, ManyToOne, PrimaryColumn } from '@n8n/typeorm';
|
||||||
import type { ExecutionAnnotation } from './execution-annotation';
|
|
||||||
import type { AnnotationTagEntity } from './annotation-tag-entity';
|
import type { AnnotationTagEntity } from './annotation-tag-entity';
|
||||||
|
import type { ExecutionAnnotation } from './execution-annotation';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This entity represents the junction table between the execution annotations and the tags
|
* This entity represents the junction table between the execution annotations and the tags
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue