mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-23 11:44:06 -08:00
refactor(core): Port Public API config (no-changelog) (#10082)
This commit is contained in:
parent
b0abee7eb6
commit
8a53d6127e
16
packages/@n8n/config/src/configs/public-api.ts
Normal file
16
packages/@n8n/config/src/configs/public-api.ts
Normal file
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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 () => {
|
||||
|
|
|
@ -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: {
|
||||
|
|
Loading…
Reference in a new issue