From 8a53d6127e186f3b863fbb8c708070ef0ead76b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 17 Jul 2024 15:36:40 +0200 Subject: [PATCH] refactor(core): Port Public API config (no-changelog) (#10082) --- .../@n8n/config/src/configs/public-api.ts | 16 +++++++++++++ packages/@n8n/config/src/index.ts | 4 ++++ packages/cli/src/PublicApi/index.ts | 5 ++-- packages/cli/src/Server.ts | 6 ++--- packages/cli/src/config/schema.ts | 23 ------------------- packages/cli/src/services/frontend.service.ts | 4 ++-- packages/cli/test/integration/me.api.test.ts | 7 +++--- .../cli/test/integration/shared/constants.ts | 4 +++- 8 files changed, 35 insertions(+), 34 deletions(-) create mode 100644 packages/@n8n/config/src/configs/public-api.ts diff --git a/packages/@n8n/config/src/configs/public-api.ts b/packages/@n8n/config/src/configs/public-api.ts new file mode 100644 index 0000000000..33e3bf3fc3 --- /dev/null +++ b/packages/@n8n/config/src/configs/public-api.ts @@ -0,0 +1,16 @@ +import { Config, Env } from '../decorators'; + +@Config +export class PublicApiConfig { + /** Whether to disable the Public API */ + @Env('N8N_PUBLIC_API_DISABLED') + readonly disabled: boolean = false; + + /** Path segment for the Public API */ + @Env('N8N_PUBLIC_API_ENDPOINT') + readonly path: string = 'api'; + + /** Whether to disable the Swagger UI for the Public API */ + @Env('N8N_PUBLIC_API_SWAGGERUI_DISABLED') + readonly swaggerUiDisabled: boolean = false; +} diff --git a/packages/@n8n/config/src/index.ts b/packages/@n8n/config/src/index.ts index 4696a0c3ca..afb906fa3b 100644 --- a/packages/@n8n/config/src/index.ts +++ b/packages/@n8n/config/src/index.ts @@ -2,6 +2,7 @@ import { Config, Nested } from './decorators'; import { CredentialsConfig } from './configs/credentials'; import { DatabaseConfig } from './configs/database'; import { EmailConfig } from './configs/email'; +import { PublicApiConfig } from './configs/public-api'; @Config class UserManagementConfig { @@ -19,4 +20,7 @@ export class GlobalConfig { @Nested userManagement: UserManagementConfig; + + @Nested + publicApi: PublicApiConfig; } diff --git a/packages/cli/src/PublicApi/index.ts b/packages/cli/src/PublicApi/index.ts index f13eeabb00..d1fb02ef31 100644 --- a/packages/cli/src/PublicApi/index.ts +++ b/packages/cli/src/PublicApi/index.ts @@ -17,6 +17,7 @@ import { License } from '@/License'; import { UserRepository } from '@db/repositories/user.repository'; import { UrlService } from '@/services/url.service'; import type { AuthenticatedRequest } from '@/requests'; +import { GlobalConfig } from '@n8n/config'; async function createApiRouter( version: string, @@ -35,7 +36,7 @@ async function createApiRouter( ]; const apiController = express.Router(); - if (!config.getEnv('publicApi.swaggerUi.disabled')) { + if (!Container.get(GlobalConfig).publicApi.swaggerUiDisabled) { const { serveFiles, setup } = await import('swagger-ui-express'); const swaggerThemePath = path.join(__dirname, 'swaggerTheme.css'); const swaggerThemeCss = await fs.readFile(swaggerThemePath, { encoding: 'utf-8' }); @@ -153,5 +154,5 @@ export const loadPublicApiVersions = async ( }; export function isApiEnabled(): boolean { - return !config.get('publicApi.disabled') && !Container.get(License).isAPIDisabled(); + return !Container.get(GlobalConfig).publicApi.disabled && !Container.get(License).isAPIDisabled(); } diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index e6c636bc23..6b8c2ebd30 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -81,6 +81,7 @@ export class Server extends AbstractServer { private readonly loadNodesAndCredentials: LoadNodesAndCredentials, private readonly orchestrationService: OrchestrationService, private readonly postHogClient: PostHogClient, + private readonly globalConfig: GlobalConfig, ) { super('main'); @@ -96,8 +97,7 @@ export class Server extends AbstractServer { this.presetCredentialsLoaded = false; - const globalConfig = Container.get(GlobalConfig); - this.endpointPresetCredentials = globalConfig.credentials.overwrite.endpoint; + this.endpointPresetCredentials = this.globalConfig.credentials.overwrite.endpoint; await super.start(); this.logger.debug(`Server ID: ${this.uniqueInstanceId}`); @@ -185,7 +185,7 @@ export class Server extends AbstractServer { await this.postHogClient.init(); - const publicApiEndpoint = config.getEnv('publicApi.path'); + const publicApiEndpoint = this.globalConfig.publicApi.path; // ---------------------------------------- // Public API diff --git a/packages/cli/src/config/schema.ts b/packages/cli/src/config/schema.ts index 11aac331d8..d532ae249f 100644 --- a/packages/cli/src/config/schema.ts +++ b/packages/cli/src/config/schema.ts @@ -562,29 +562,6 @@ export const schema = { }, }, - publicApi: { - disabled: { - format: Boolean, - default: false, - env: 'N8N_PUBLIC_API_DISABLED', - doc: 'Whether to disable the Public API', - }, - path: { - format: String, - default: 'api', - env: 'N8N_PUBLIC_API_ENDPOINT', - doc: 'Path for the public api endpoints', - }, - swaggerUi: { - disabled: { - format: Boolean, - default: false, - env: 'N8N_PUBLIC_API_SWAGGERUI_DISABLED', - doc: 'Whether to disable the Swagger UI for the Public API', - }, - }, - }, - workflowTagsDisabled: { format: Boolean, default: false, diff --git a/packages/cli/src/services/frontend.service.ts b/packages/cli/src/services/frontend.service.ts index bce1db3881..a356230c7e 100644 --- a/packages/cli/src/services/frontend.service.ts +++ b/packages/cli/src/services/frontend.service.ts @@ -152,9 +152,9 @@ export class FrontendService { publicApi: { enabled: isApiEnabled(), latestVersion: 1, - path: config.getEnv('publicApi.path'), + path: this.globalConfig.publicApi.path, swaggerUi: { - enabled: !config.getEnv('publicApi.swaggerUi.disabled'), + enabled: !Container.get(GlobalConfig).publicApi.swaggerUiDisabled, }, }, workflowTagsDisabled: config.getEnv('workflowTagsDisabled'), diff --git a/packages/cli/test/integration/me.api.test.ts b/packages/cli/test/integration/me.api.test.ts index d23cd53132..30e2ff27d1 100644 --- a/packages/cli/test/integration/me.api.test.ts +++ b/packages/cli/test/integration/me.api.test.ts @@ -3,7 +3,6 @@ import { IsNull } from '@n8n/typeorm'; import validator from 'validator'; import { randomString } from 'n8n-workflow'; -import config from '@/config'; import type { User } from '@db/entities/User'; import { UserRepository } from '@db/repositories/user.repository'; import { ProjectRepository } from '@db/repositories/project.repository'; @@ -14,12 +13,14 @@ import * as testDb from './shared/testDb'; import * as utils from './shared/utils/'; import { addApiKey, createOwner, createUser, createUserShell } from './shared/db/users'; import type { SuperAgentTest } from './shared/types'; +import { mockInstance } from '@test/mocking'; +import { GlobalConfig } from '@n8n/config'; const testServer = utils.setupTestServer({ endpointGroups: ['me'] }); beforeEach(async () => { await testDb.truncate(['User']); - config.set('publicApi.disabled', false); + mockInstance(GlobalConfig, { publicApi: { disabled: false } }); }); describe('When public API is disabled', () => { @@ -30,7 +31,7 @@ describe('When public API is disabled', () => { owner = await createOwner(); await addApiKey(owner); authAgent = testServer.authAgentFor(owner); - config.set('publicApi.disabled', true); + mockInstance(GlobalConfig, { publicApi: { disabled: true } }); }); test('POST /me/api-key should 404', async () => { diff --git a/packages/cli/test/integration/shared/constants.ts b/packages/cli/test/integration/shared/constants.ts index 7b32134cab..caa3667c23 100644 --- a/packages/cli/test/integration/shared/constants.ts +++ b/packages/cli/test/integration/shared/constants.ts @@ -1,8 +1,10 @@ import config from '@/config'; +import { GlobalConfig } from '@n8n/config'; +import Container from 'typedi'; export const REST_PATH_SEGMENT = config.getEnv('endpoints.rest'); -export const PUBLIC_API_REST_PATH_SEGMENT = config.getEnv('publicApi.path'); +export const PUBLIC_API_REST_PATH_SEGMENT = Container.get(GlobalConfig).publicApi.path; export const SUCCESS_RESPONSE_BODY = { data: {