From 6e6c5bc776f0352ab5e81939ba57be64228dd6ae Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 6 Oct 2023 12:31:52 +0100 Subject: [PATCH] Handle arrays and fix issue brought up by REST testcase. --- .../sdk/app/rows/search/tests/utils.spec.ts | 29 ++++++++++++++++-- .../server/src/sdk/app/rows/search/utils.ts | 30 +++++++++++++++---- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/packages/server/src/sdk/app/rows/search/tests/utils.spec.ts b/packages/server/src/sdk/app/rows/search/tests/utils.spec.ts index a1cb4fe48d..08d1f1b1cb 100644 --- a/packages/server/src/sdk/app/rows/search/tests/utils.spec.ts +++ b/packages/server/src/sdk/app/rows/search/tests/utils.spec.ts @@ -21,9 +21,10 @@ const tableWithUserCol: Table = { } describe("searchInputMapping", () => { + const globalUserId = dbCore.generateGlobalUserID() + const userMedataId = dbCore.generateUserMetadataID(globalUserId) + it("should be able to map ro_ to global user IDs", () => { - const globalUserId = dbCore.generateGlobalUserID() - const userMedataId = dbCore.generateUserMetadataID(globalUserId) const params: SearchParams = { tableId, query: { @@ -36,6 +37,22 @@ describe("searchInputMapping", () => { expect(output.query.equal!["1:user"]).toBe(globalUserId) }) + it("should handle array of user IDs", () => { + const params: SearchParams = { + tableId, + query: { + oneOf: { + "1:user": [userMedataId, globalUserId], + }, + }, + } + const output = searchInputMapping(tableWithUserCol, params) + expect(output.query.oneOf!["1:user"]).toStrictEqual([ + globalUserId, + globalUserId, + ]) + }) + it("shouldn't change any other input", () => { const email = "test@test.com" const params: SearchParams = { @@ -49,4 +66,12 @@ describe("searchInputMapping", () => { const output = searchInputMapping(tableWithUserCol, params) expect(output.query.equal!["1:user"]).toBe(email) }) + + it("shouldn't error if no query supplied", () => { + const params: any = { + tableId, + } + const output = searchInputMapping(tableWithUserCol, params) + expect(output.query).toBeUndefined() + }) }) diff --git a/packages/server/src/sdk/app/rows/search/utils.ts b/packages/server/src/sdk/app/rows/search/utils.ts index 5afa13c53d..f475296333 100644 --- a/packages/server/src/sdk/app/rows/search/utils.ts +++ b/packages/server/src/sdk/app/rows/search/utils.ts @@ -13,6 +13,9 @@ function findColumnInQueries( options: SearchParams, callback: (filter: any) => any ) { + if (!options.query) { + return + } for (let filterBlock of Object.values(options.query)) { if (typeof filterBlock !== "object") { continue @@ -27,15 +30,30 @@ function findColumnInQueries( function userColumnMapping(column: string, options: SearchParams) { findColumnInQueries(column, options, (filterValue: any): string => { - if (typeof filterValue !== "string") { + const isArray = Array.isArray(filterValue), + isString = typeof filterValue === "string" + if (!isString && !isArray) { return filterValue } - const rowPrefix = DocumentType.ROW + SEPARATOR - // TODO: at some point in future might want to handle mapping emails to IDs - if (filterValue.startsWith(rowPrefix)) { - return dbCore.getGlobalIDFromUserMetadataID(filterValue) + const processString = (input: string) => { + const rowPrefix = DocumentType.ROW + SEPARATOR + if (input.startsWith(rowPrefix)) { + return dbCore.getGlobalIDFromUserMetadataID(input) + } else { + return input + } + } + if (isArray) { + return filterValue.map(el => { + if (typeof el === "string") { + return processString(el) + } else { + return el + } + }) + } else { + return processString(filterValue) } - return filterValue }) }