diff --git a/__tests__/unit/core-api/plugins/comma-array-query.test.ts b/__tests__/unit/core-api/plugins/comma-array-query.test.ts new file mode 100644 index 0000000000..f7dcc023a6 --- /dev/null +++ b/__tests__/unit/core-api/plugins/comma-array-query.test.ts @@ -0,0 +1,61 @@ +import { commaArrayQuery } from "@packages/core-api/src/plugins/comma-array-query"; + +describe("commaArrayQuery.register", () => { + it("should register onRequest extension", () => { + const server = { + ext: jest.fn(), + }; + + commaArrayQuery.register(server); + + expect(server.ext).toBeCalledWith("onRequest", commaArrayQuery.onRequest); + }); +}); + +describe("commaArrayQuery.onRequest", () => { + it("should replace comma separated query parameter by array", () => { + const addresses = [ + "AXGc1bgU3v3rHmx9WVkUUHLA6gbzh8La7V", + "AQvWbCAXbBnY9fHpgNrcLZ99hYfDifH4Hs", + "ATKegneyu9Fkoj5FxiJ3biup8xv8zM34M3", + ]; + const request = { + query: { + address: addresses.join(","), + }, + }; + + const h = { + continue: Symbol, + }; + + const ret = commaArrayQuery.onRequest(request, h); + + expect(request.query).toEqual({ + address: addresses, + }); + + expect(ret).toBe(h.continue); + }); + + it("should leave as-is query parameter without comma", () => { + const address = "AXGc1bgU3v3rHmx9WVkUUHLA6gbzh8La7V"; + const request = { + query: { + address, + }, + }; + + const h = { + continue: Symbol, + }; + + const ret = commaArrayQuery.onRequest(request, h); + + expect(request.query).toEqual({ + address, + }); + + expect(ret).toBe(h.continue); + }); +}); diff --git a/packages/core-api/src/plugins/comma-array-query.ts b/packages/core-api/src/plugins/comma-array-query.ts new file mode 100644 index 0000000000..abdd4ec3ec --- /dev/null +++ b/packages/core-api/src/plugins/comma-array-query.ts @@ -0,0 +1,22 @@ +import Hapi from "@hapi/hapi"; + +export const commaArrayQuery = { + name: "comma-array-query", + version: "1.0.0", + + register(server: Hapi.Server): void { + server.ext("onRequest", this.onRequest); + }, + + onRequest(request: Hapi.Request, h: Hapi.ResponseToolkit): Hapi.Lifecycle.ReturnValue { + const query = {}; + const separator = ","; + + for (const [key, value] of Object.entries(request.query as { [key: string]: string })) { + query[key] = value.indexOf(separator) > -1 ? value.split(separator) : value; + } + + request.query = query; + return h.continue; + }, +}; diff --git a/packages/core-api/src/plugins/index.ts b/packages/core-api/src/plugins/index.ts index 9c0d76fa6a..772a4af673 100644 --- a/packages/core-api/src/plugins/index.ts +++ b/packages/core-api/src/plugins/index.ts @@ -1,4 +1,5 @@ import { dotSeparatedQuery } from "./dot-separated-query"; +import { commaArrayQuery } from "./comma-array-query"; import { hapiAjv } from "./hapi-ajv"; import { whitelist } from "./whitelist"; @@ -10,6 +11,7 @@ export const preparePlugins = (config) => [ }, }, { plugin: hapiAjv }, + { plugin: commaArrayQuery }, { plugin: dotSeparatedQuery }, { plugin: require("./cache"),