Skip to content

Commit 0a69f65

Browse files
authored
feat(core-api): transform comma query into array to allow OR (#4068)
1 parent da2e563 commit 0a69f65

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { commaArrayQuery } from "@packages/core-api/src/plugins/comma-array-query";
2+
3+
describe("commaArrayQuery.register", () => {
4+
it("should register onRequest extension", () => {
5+
const server = {
6+
ext: jest.fn(),
7+
};
8+
9+
commaArrayQuery.register(server);
10+
11+
expect(server.ext).toBeCalledWith("onRequest", commaArrayQuery.onRequest);
12+
});
13+
});
14+
15+
describe("commaArrayQuery.onRequest", () => {
16+
it("should replace comma separated query parameter by array", () => {
17+
const addresses = [
18+
"AXGc1bgU3v3rHmx9WVkUUHLA6gbzh8La7V",
19+
"AQvWbCAXbBnY9fHpgNrcLZ99hYfDifH4Hs",
20+
"ATKegneyu9Fkoj5FxiJ3biup8xv8zM34M3",
21+
];
22+
const request = {
23+
query: {
24+
address: addresses.join(","),
25+
},
26+
};
27+
28+
const h = {
29+
continue: Symbol,
30+
};
31+
32+
const ret = commaArrayQuery.onRequest(request, h);
33+
34+
expect(request.query).toEqual({
35+
address: addresses,
36+
});
37+
38+
expect(ret).toBe(h.continue);
39+
});
40+
41+
it("should leave as-is query parameter without comma", () => {
42+
const address = "AXGc1bgU3v3rHmx9WVkUUHLA6gbzh8La7V";
43+
const request = {
44+
query: {
45+
address,
46+
},
47+
};
48+
49+
const h = {
50+
continue: Symbol,
51+
};
52+
53+
const ret = commaArrayQuery.onRequest(request, h);
54+
55+
expect(request.query).toEqual({
56+
address,
57+
});
58+
59+
expect(ret).toBe(h.continue);
60+
});
61+
});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import Hapi from "@hapi/hapi";
2+
3+
export const commaArrayQuery = {
4+
name: "comma-array-query",
5+
version: "1.0.0",
6+
7+
register(server: Hapi.Server): void {
8+
server.ext("onRequest", this.onRequest);
9+
},
10+
11+
onRequest(request: Hapi.Request, h: Hapi.ResponseToolkit): Hapi.Lifecycle.ReturnValue {
12+
const query = {};
13+
const separator = ",";
14+
15+
for (const [key, value] of Object.entries(request.query as { [key: string]: string })) {
16+
query[key] = value.indexOf(separator) > -1 ? value.split(separator) : value;
17+
}
18+
19+
request.query = query;
20+
return h.continue;
21+
},
22+
};

packages/core-api/src/plugins/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { dotSeparatedQuery } from "./dot-separated-query";
2+
import { commaArrayQuery } from "./comma-array-query";
23
import { hapiAjv } from "./hapi-ajv";
34
import { whitelist } from "./whitelist";
45

@@ -10,6 +11,7 @@ export const preparePlugins = (config) => [
1011
},
1112
},
1213
{ plugin: hapiAjv },
14+
{ plugin: commaArrayQuery },
1315
{ plugin: dotSeparatedQuery },
1416
{
1517
plugin: require("./cache"),

0 commit comments

Comments
 (0)