diff --git a/src/index.ts b/src/index.ts index b065fbb..39b0bf1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import * as DB from "@foxify/odin/dist/DB"; import * as Foxify from "foxify"; import { Router } from "foxify/framework/routing"; import * as pluralize from "prototyped.js/es6/string/pluralize/method"; -import { parse } from "qs"; +import { IParseOptions,parse } from "qs"; import { count, delete as deleteController, index, responder, show, store, update, } from "./controllers"; @@ -58,6 +58,7 @@ namespace restify { export interface Options

{ name: string; prefix: string; + qs: IParseOptions; defaults: Query; routes: P extends true ? Partial : RoutesOptions; } @@ -72,6 +73,10 @@ const restify = (model: typeof Odin, options: Partial> = { name: model.toString(), prefix: "", ...options, + qs: { + depth: 100, + ...(options.qs || {}), + }, defaults: { limit: 10, skip: 0, @@ -92,7 +97,7 @@ const restify = (model: typeof Odin, options: Partial> = { const foxifyRestifyOdin: (single?: boolean) => Foxify.Handler = (single = false) => { return function foxify_restify_odin(req, res, next) { - const parsed = parse((req.url as string).replace(/^.*\?/, "")); + const parsed = parse((req.url as string).replace(/^.*\?/, ""), options.qs); const decoded = Object.assign({}, options.defaults, decoder(parsed)); diff --git a/test/index/filter.ts b/test/index/filter.ts index a67e3f7..200158f 100644 --- a/test/index/filter.ts +++ b/test/index/filter.ts @@ -462,3 +462,43 @@ it("Should filter [whereHas inside first level and]", async () => { meta: { limit: 10, page: 0, count: users.length, total_count: users.length }, }); }); + +it("Should filter [whereHas and]", async () => { + expect.assertions(1); + + const app = new Foxify(); + + app.use(restify(User)); + + const result = await app.inject(`/users?${stringify( + { + filter: { + and: [ + { + has: { + relation: "age", + filter: { + and: [ + { + field: "age", + operator: "gte", + value: 25, + }, + ], + }, + }, + }, + ], + }, + }, + )}`); + + const users = ITEMS + .filter(({ username }) => ITEMS2.any(item => item.username === username && item.age >= 25)); + + expect(JSON.parse(result.body)) + .toEqual({ + users, + meta: { limit: 10, page: 0, count: users.length, total_count: users.length }, + }); +});