mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 10:02:05 +00:00
fix(core): Fix 431 for large dynamic node parameters (#9384)
This commit is contained in:
@@ -1,54 +1,27 @@
|
||||
import type { RequestHandler } from 'express';
|
||||
import { NextFunction, Response } from 'express';
|
||||
import type {
|
||||
INodeListSearchResult,
|
||||
INodePropertyOptions,
|
||||
ResourceMapperFields,
|
||||
} from 'n8n-workflow';
|
||||
import type { INodePropertyOptions } from 'n8n-workflow';
|
||||
import { jsonParse } from 'n8n-workflow';
|
||||
|
||||
import { Get, Middleware, RestController } from '@/decorators';
|
||||
import { Post, RestController } from '@/decorators';
|
||||
import { getBase } from '@/WorkflowExecuteAdditionalData';
|
||||
import { DynamicNodeParametersService } from '@/services/dynamicNodeParameters.service';
|
||||
import { DynamicNodeParametersRequest } from '@/requests';
|
||||
import { BadRequestError } from '@/errors/response-errors/bad-request.error';
|
||||
|
||||
const assertMethodName: RequestHandler = (req, res, next) => {
|
||||
const { methodName } = req.query as DynamicNodeParametersRequest.BaseRequest['query'];
|
||||
if (!methodName) {
|
||||
throw new BadRequestError('Parameter methodName is required.');
|
||||
}
|
||||
next();
|
||||
};
|
||||
|
||||
@RestController('/dynamic-node-parameters')
|
||||
export class DynamicNodeParametersController {
|
||||
constructor(private readonly service: DynamicNodeParametersService) {}
|
||||
|
||||
@Middleware()
|
||||
parseQueryParams(req: DynamicNodeParametersRequest.BaseRequest, _: Response, next: NextFunction) {
|
||||
const { credentials, currentNodeParameters, nodeTypeAndVersion } = req.query;
|
||||
if (!nodeTypeAndVersion) {
|
||||
throw new BadRequestError('Parameter nodeTypeAndVersion is required.');
|
||||
}
|
||||
if (!currentNodeParameters) {
|
||||
throw new BadRequestError('Parameter currentNodeParameters is required.');
|
||||
}
|
||||
|
||||
req.params = {
|
||||
nodeTypeAndVersion: jsonParse(nodeTypeAndVersion),
|
||||
currentNodeParameters: jsonParse(currentNodeParameters),
|
||||
credentials: credentials ? jsonParse(credentials) : undefined,
|
||||
};
|
||||
|
||||
next();
|
||||
}
|
||||
|
||||
/** Returns parameter values which normally get loaded from an external API or get generated dynamically */
|
||||
@Get('/options')
|
||||
@Post('/options')
|
||||
async getOptions(req: DynamicNodeParametersRequest.Options): Promise<INodePropertyOptions[]> {
|
||||
const { path, methodName, loadOptions } = req.query;
|
||||
const { credentials, currentNodeParameters, nodeTypeAndVersion } = req.params;
|
||||
const {
|
||||
credentials,
|
||||
currentNodeParameters,
|
||||
nodeTypeAndVersion,
|
||||
path,
|
||||
methodName,
|
||||
loadOptions,
|
||||
} = req.body;
|
||||
|
||||
const additionalData = await getBase(req.user.id, currentNodeParameters);
|
||||
|
||||
if (methodName) {
|
||||
@@ -75,13 +48,22 @@ export class DynamicNodeParametersController {
|
||||
return [];
|
||||
}
|
||||
|
||||
@Get('/resource-locator-results', { middlewares: [assertMethodName] })
|
||||
async getResourceLocatorResults(
|
||||
req: DynamicNodeParametersRequest.ResourceLocatorResults,
|
||||
): Promise<INodeListSearchResult | undefined> {
|
||||
const { path, methodName, filter, paginationToken } = req.query;
|
||||
const { credentials, currentNodeParameters, nodeTypeAndVersion } = req.params;
|
||||
@Post('/resource-locator-results')
|
||||
async getResourceLocatorResults(req: DynamicNodeParametersRequest.ResourceLocatorResults) {
|
||||
const {
|
||||
path,
|
||||
methodName,
|
||||
filter,
|
||||
paginationToken,
|
||||
credentials,
|
||||
currentNodeParameters,
|
||||
nodeTypeAndVersion,
|
||||
} = req.body;
|
||||
|
||||
if (!methodName) throw new BadRequestError('Missing `methodName` in request body');
|
||||
|
||||
const additionalData = await getBase(req.user.id, currentNodeParameters);
|
||||
|
||||
return await this.service.getResourceLocatorResults(
|
||||
methodName,
|
||||
path,
|
||||
@@ -94,13 +76,14 @@ export class DynamicNodeParametersController {
|
||||
);
|
||||
}
|
||||
|
||||
@Get('/resource-mapper-fields', { middlewares: [assertMethodName] })
|
||||
async getResourceMappingFields(
|
||||
req: DynamicNodeParametersRequest.ResourceMapperFields,
|
||||
): Promise<ResourceMapperFields | undefined> {
|
||||
const { path, methodName } = req.query;
|
||||
const { credentials, currentNodeParameters, nodeTypeAndVersion } = req.params;
|
||||
@Post('/resource-mapper-fields')
|
||||
async getResourceMappingFields(req: DynamicNodeParametersRequest.ResourceMapperFields) {
|
||||
const { path, methodName, credentials, currentNodeParameters, nodeTypeAndVersion } = req.body;
|
||||
|
||||
if (!methodName) throw new BadRequestError('Missing `methodName` in request body');
|
||||
|
||||
const additionalData = await getBase(req.user.id, currentNodeParameters);
|
||||
|
||||
return await this.service.getResourceMappingFields(
|
||||
methodName,
|
||||
path,
|
||||
|
||||
Reference in New Issue
Block a user