From c49db571cd95fc6f7b4bf1cbcc68ed5e15534544 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Mon, 5 Dec 2022 14:53:29 +0800 Subject: [PATCH] Add search by recommendedBy group name --- packages/api/src/elastic/pages.ts | 17 +++++++++++++++++ packages/api/src/elastic/types.ts | 11 +++++++++++ packages/api/src/utils/search.ts | 14 ++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/packages/api/src/elastic/pages.ts b/packages/api/src/elastic/pages.ts index c7222741a..8cb48fbbf 100644 --- a/packages/api/src/elastic/pages.ts +++ b/packages/api/src/elastic/pages.ts @@ -186,6 +186,19 @@ const appendIdsFilter = (body: SearchBody, ids: string[]): void => { }) } +const appendRecommendedBy = (body: SearchBody, recommendedBy: string): void => { + body.query.bool.must.push({ + nested: { + path: 'recommendedBy', + query: { + term: { + 'recommendedBy.name': recommendedBy, + }, + }, + }, + }) +} + export const createPage = async ( page: Page, ctx: PageContext @@ -441,6 +454,10 @@ export const searchPages = async ( appendIdsFilter(body, ids) } + if (args.recommendedBy) { + appendRecommendedBy(body, args.recommendedBy) + } + if (!args.includePending) { body.query.bool.must_not.push({ term: { diff --git a/packages/api/src/elastic/types.ts b/packages/api/src/elastic/types.ts index c838750c6..de2a0dd58 100644 --- a/packages/api/src/elastic/types.ts +++ b/packages/api/src/elastic/types.ts @@ -51,6 +51,16 @@ export interface SearchBody { } } } + | { + nested: { + path: 'recommendedBy' + query: { + term: { + 'recommendedBy.name': string + } + } + } + } | { match: { [K: string]: string @@ -292,4 +302,5 @@ export interface PageSearchArgs { includePending?: boolean | null includeDeleted?: boolean ids?: string[] + recommendedBy?: string } diff --git a/packages/api/src/utils/search.ts b/packages/api/src/utils/search.ts index da9a157a6..05c2cc3fe 100644 --- a/packages/api/src/utils/search.ts +++ b/packages/api/src/utils/search.ts @@ -35,6 +35,7 @@ export interface SearchFilter { termFilters: FieldFilter[] matchFilters: FieldFilter[] ids: string[] + recommendedBy?: string } export enum LabelFilterType { @@ -82,6 +83,14 @@ export interface FieldFilter { value: string } +const parseRecommendedBy = (str?: string): string | undefined => { + if (str === undefined) { + return undefined + } + + return str.toLowerCase() +} + const parseIsFilter = (str: string | undefined): ReadFilter => { switch (str?.toUpperCase()) { case 'READ': @@ -300,6 +309,7 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { 'content', 'updated', 'includes', + 'recommendedBy', ], tokenize: true, }) @@ -381,6 +391,10 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { ids && result.ids.push(...ids) break } + case 'recommendedBy': { + result.recommendedBy = parseRecommendedBy(keyword.value) + break + } } } }