From 7869607165df158236c0f436e541c7902f0c0a5e Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 24 Sep 2024 19:16:45 -0400 Subject: [PATCH] simplify parameter sorting Signed-off-by: aramissennyeydd --- packages/backend-openapi-utils/src/index.ts | 6 +- .../src/schema/parameter-validation.ts | 77 +++++++------------ 2 files changed, 30 insertions(+), 53 deletions(-) diff --git a/packages/backend-openapi-utils/src/index.ts b/packages/backend-openapi-utils/src/index.ts index 24f4183311..57d9f755c2 100644 --- a/packages/backend-openapi-utils/src/index.ts +++ b/packages/backend-openapi-utils/src/index.ts @@ -32,8 +32,4 @@ export type { } from './utility'; export type { ApiRouter } from './router'; export { createValidatedOpenApiRouter, getOpenApiSpecRoute } from './stub'; -export { - wrapInOpenApiTestServer, - wrapServer, - setupProxyHooks, -} from './testUtils'; +export { wrapInOpenApiTestServer, wrapServer } from './testUtils'; diff --git a/packages/backend-openapi-utils/src/schema/parameter-validation.ts b/packages/backend-openapi-utils/src/schema/parameter-validation.ts index 90953e6e2a..cbcb098166 100644 --- a/packages/backend-openapi-utils/src/schema/parameter-validation.ts +++ b/packages/backend-openapi-utils/src/schema/parameter-validation.ts @@ -95,10 +95,6 @@ class BaseParameterParser { } } -const PLACE_A_BEFORE_B = -1; -const PLACE_A_AFTER_B = 1; -const EQUAL = 0; - export class QueryParameterParser extends BaseParameterParser implements RequestParser> @@ -111,51 +107,36 @@ export class QueryParameterParser const remainingQueryParameters = new Set(searchParams.keys()); const queryParameters: Record = {}; - const parameterIterator = Object.entries(this.parameters); + let parameterIterator = Object.entries(this.parameters); + + const isFormExplode = (parameter: ReferencelessParameterObject) => { + return ( + parameter.schema?.type === 'object' && + (parameter.style === 'form' || !parameter.style) && + parameter.explode + ); + }; + + const regularParameters = parameterIterator.filter( + ([_, parameter]) => !isFormExplode(parameter), + ); + + const formExplodeParameters = parameterIterator.filter(([_, parameter]) => + isFormExplode(parameter), + ); + + if (formExplodeParameters.length > 1) { + throw new OperationError( + this.operation, + 'Ambiguous query parameters, you cannot have 2 form explode parameters', + ); + } + + // Sort the parameters so that form explode parameters are processed last. + parameterIterator = [...regularParameters, ...formExplodeParameters]; + + console.log(parameterIterator); - // object parameters with form/explode style should be processed last as they collect all remaining parameters. - parameterIterator.sort(([_, parameterA], [_B, parameterB]) => { - if ( - parameterA.schema.type !== 'object' && - parameterB.schema.type !== 'object' - ) { - return EQUAL; - } - if ( - parameterA.schema.type === 'object' && - parameterB.schema.type !== 'object' - ) { - return PLACE_A_AFTER_B; - } - if ( - parameterA.schema.type !== 'object' && - parameterB.schema.type === 'object' - ) { - return PLACE_A_BEFORE_B; - } - const isParameterAForm = parameterA.style === 'form' || !parameterA.style; - const isParameterAFormExplode = - isParameterAForm && - (parameterA.explode || typeof parameterA.explode === 'undefined'); - const isParameterBForm = parameterB.style === 'form' || !parameterB.style; - const isParameterBFormExplode = - isParameterBForm && - (parameterB.explode || typeof parameterB.explode === 'undefined'); - // Sort the form explode to the bottom of the array. - if (isParameterAFormExplode && isParameterBFormExplode) { - throw new OperationError( - this.operation, - 'Ambiguous query parameters, you cannot have 2 form explode parameters', - ); - } - if (isParameterAFormExplode) { - return PLACE_A_AFTER_B; - } - if (isParameterBFormExplode) { - return PLACE_A_BEFORE_B; - } - return EQUAL; - }); for (const [name, parameter] of parameterIterator) { if (!parameter.schema) { throw new OperationError(