diff --git a/apps/meteor/app/api/server/router.spec.ts b/apps/meteor/app/api/server/router.spec.ts index ca5bd8970ae84..5c11ef6e0456f 100644 --- a/apps/meteor/app/api/server/router.spec.ts +++ b/apps/meteor/app/api/server/router.spec.ts @@ -48,4 +48,44 @@ describe('Router use method', () => { expect(response2.statusCode).toBe(200); expect(response2.headers).not.toHaveProperty('x-api-version'); }); + + it('should parse nested query params into object for GET requests', async () => { + const ajv = new Ajv(); + const app = express(); + + const isTestQueryParams = ajv.compile({ + type: 'object', + properties: { + outerProperty: { type: 'object', properties: { innerProperty: { type: 'string' } } }, + }, + additionalProperties: false, + }); + + const api = new Router('/api').get( + '/test', + { + response: { + 200: isTestQueryParams, + }, + query: isTestQueryParams, + }, + async function action() { + const { outerProperty } = this.queryParams as any; + return { + statusCode: 200, + body: { + outerProperty, + }, + }; + }, + ); + + app.use(api.router); + + const response1 = await request(app).get('/api/test?outerProperty[innerProperty]=test'); + + expect(response1.statusCode).toBe(200); + expect(response1.body).toHaveProperty('outerProperty'); + expect(response1.body.outerProperty).toHaveProperty('innerProperty', 'test'); + }); }); diff --git a/apps/meteor/app/api/server/router.ts b/apps/meteor/app/api/server/router.ts index a919ffb2ac00b..c18598f03c8b5 100644 --- a/apps/meteor/app/api/server/router.ts +++ b/apps/meteor/app/api/server/router.ts @@ -191,9 +191,12 @@ export class Router< this.innerRouter[method.toLowerCase() as Lowercase](`/${subpath}`.replace('//', '/'), ...middlewares, async (c) => { const { req, res } = c; req.raw.route = `${c.var.route ?? ''}${subpath}`; + + const queryParams = this.parseQueryParams(req); + if (options.query) { const validatorFn = options.query; - if (typeof options.query === 'function' && !validatorFn(req.query())) { + if (typeof options.query === 'function' && !validatorFn(queryParams)) { return c.json( { success: false, @@ -229,7 +232,7 @@ export class Router< { requestIp: c.get('remoteAddress'), urlParams: req.param(), - queryParams: this.parseQueryParams(req), + queryParams, bodyParams, request: req.raw.clone(), path: req.path,