diff --git a/src/middlewares/openapi.request.validator.ts b/src/middlewares/openapi.request.validator.ts index 734502b9..82b0b7f7 100644 --- a/src/middlewares/openapi.request.validator.ts +++ b/src/middlewares/openapi.request.validator.ts @@ -343,6 +343,16 @@ export class RequestValidator { if (parameter.content && parameter.content[TYPE_JSON]) { parameterSchema = parameter.content[TYPE_JSON].schema; parseJson.push({ name, reqField }); + } else if ( + // handle complex json types in schema + $in === 'query' && + (parameterSchema.allOf || + parameterSchema.oneOf || + parameterSchema.anyOf || + (parameterSchema.type === 'object' && + parameterSchema.type !== 'array')) + ) { + parseJson.push({ name, reqField }); } if (!parameterSchema) { diff --git a/test/resources/serialized.objects.yaml b/test/resources/serialized.objects.yaml new file mode 100644 index 00000000..96557eb1 --- /dev/null +++ b/test/resources/serialized.objects.yaml @@ -0,0 +1,52 @@ + +openapi: '3.0.2' +info: + version: 1.0.0 + title: requestBodies $ref + description: requestBodies $ref Test + +servers: + - url: /v1/ + +paths: + /serialisable: + get: + summary: "Retrieve something" + parameters: + - in: query + style: form + name: settings + explode: true + schema: + allOf: + - type: object + properties: + onlyValidated: + type: boolean + default: true + onlySelected: + type: array + default: [] + uniqueItems: true + items: + type: integer + minimum: 0 + example: 42 + responses: + '200': + description: "An array of items" + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/someItem" + uniqueItems: true + +components: + schemas: + someItem: + type: object + properties: + id: + type: string \ No newline at end of file diff --git a/test/serialized.objects.spec.ts b/test/serialized.objects.spec.ts new file mode 100644 index 00000000..192f10c1 --- /dev/null +++ b/test/serialized.objects.spec.ts @@ -0,0 +1,34 @@ +import * as path from 'path'; +import * as express from 'express'; +import * as request from 'supertest'; +import * as packageJson from '../package.json'; +import { createApp } from './common/app'; + +describe(packageJson.name, () => { + let app = null; + + before(async () => { + // Set up the express app + const apiSpec = path.join('test', 'resources', 'serialized.objects.yaml'); + app = await createApp({ apiSpec }, 3005, app => + app.use( + `${app.basePath}`, + express + .Router() + .get(`/serialisable`, (req, res) => res.json({ id: 'test' })), + ), + ); + }); + + after(() => { + app.server.close(); + }); + + it('should deserialize object', async () => + request(app) + .get(`${app.basePath}/serialisable`) + .query({ + settings: '{"onlyValidated":true}', + }) + .expect(200)); +});