From f053b60cbeb29810542b6f43497765fe5007d5c2 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 21 Mar 2023 13:03:23 +0800 Subject: [PATCH] Allow array values in page filters --- packages/api/src/elastic/pages.ts | 39 ++++++++++++++----------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/packages/api/src/elastic/pages.ts b/packages/api/src/elastic/pages.ts index 0f866b700..77f6b492a 100644 --- a/packages/api/src/elastic/pages.ts +++ b/packages/api/src/elastic/pages.ts @@ -328,33 +328,30 @@ export const deletePage = async ( } export const getPageByParam = async ( - param: Record, + params: Record, includeOriginalHtml = false ): Promise => { try { - const params = { - query: { - bool: { - filter: Object.keys(param) - .filter( - (key) => param[key as K] !== undefined && param[key as K] !== null - ) // filter out undefined and null values - .map((key) => ({ - term: { - [key]: param[key as K], - }, - })), - }, - }, - size: 1, - _source: { + let builder = esBuilder() + .size(1) + .rawOption('_source', { excludes: includeOriginalHtml ? [] : ['originalHtml'], - }, - } - + }) + // filter out undefined and null values and empty arrays + // and build the query + Object.entries(params) + .filter( + ([, value]) => + value != null && !(Array.isArray(value) && value.length === 0) + ) + .forEach(([key, value]) => { + Array.isArray(value) + ? (builder = builder.query('terms', key, value)) + : (builder = builder.query('term', key, value)) + }) const { body } = await client.search>({ index: INDEX_ALIAS, - body: params, + body: builder.build(), }) if (body.hits.total.value === 0) {