From 71aa66ea9c82cad786e986101139e5c7938e63d6 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 22 Apr 2022 08:47:41 +0800 Subject: [PATCH] Allow search for subscription:name (#461) --- packages/api/index_settings.json | 3 ++- packages/api/src/elastic/pages.ts | 17 +++++++++++++++++ packages/api/src/elastic/types.ts | 5 +++++ packages/api/src/resolvers/article/index.ts | 3 +++ packages/api/src/utils/search.ts | 21 +++++++++++++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/packages/api/index_settings.json b/packages/api/index_settings.json index 8f7ff2630..bf7aebcfd 100644 --- a/packages/api/index_settings.json +++ b/packages/api/index_settings.json @@ -99,7 +99,8 @@ "type": "text" }, "subscription": { - "type": "keyword" + "type": "keyword", + "normalizer": "lowercase_normalizer" } } } diff --git a/packages/api/src/elastic/pages.ts b/packages/api/src/elastic/pages.ts index 119c3c1f4..7ed529420 100644 --- a/packages/api/src/elastic/pages.ts +++ b/packages/api/src/elastic/pages.ts @@ -16,6 +16,7 @@ import { SortBy, SortOrder, SortParams, + SubscriptionFilter, } from '../utils/search' import { client, INDEX_ALIAS } from './index' import { EntityType } from '../datalayer/pubsub' @@ -170,6 +171,17 @@ const appendPublishedDateFilter = ( }) } +const appendSubscriptionFilter = ( + body: SearchBody, + filter: SubscriptionFilter +): void => { + body.query.bool.filter.push({ + term: { + subscription: filter.name, + }, + }) +} + export const createPage = async ( page: Page, ctx: PageContext @@ -322,6 +334,7 @@ export const searchPages = async ( hasFilters?: HasFilter[] savedDateFilter?: DateRangeFilter publishedDateFilter?: DateRangeFilter + subscriptionFilter?: SubscriptionFilter }, userId: string ): Promise<[Page[], number] | undefined> => { @@ -338,6 +351,7 @@ export const searchPages = async ( hasFilters = [], savedDateFilter, publishedDateFilter, + subscriptionFilter, } = args // default order is descending const sortOrder = sort?.order || SortOrder.DESCENDING @@ -406,6 +420,9 @@ export const searchPages = async ( if (publishedDateFilter) { appendPublishedDateFilter(body, publishedDateFilter) } + if (subscriptionFilter) { + appendSubscriptionFilter(body, subscriptionFilter) + } console.log('searching pages in elastic', JSON.stringify(body)) diff --git a/packages/api/src/elastic/types.ts b/packages/api/src/elastic/types.ts index 192a4acf0..69b2af47d 100644 --- a/packages/api/src/elastic/types.ts +++ b/packages/api/src/elastic/types.ts @@ -11,6 +11,11 @@ export interface SearchBody { userId: string } } + | { + term: { + subscription: string + } + } | { term: { pageType: string } } | { exists: { field: string } } | { diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index aed133929..21221ca0e 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -463,6 +463,7 @@ export const getArticlesResolver = authorized< hasFilters: searchQuery.hasFilters, savedDateFilter: searchQuery.savedDateFilter, publishedDateFilter: searchQuery.publishedDateFilter, + subscriptionFilter: searchQuery.subscriptionFilter, }, }) @@ -481,6 +482,7 @@ export const getArticlesResolver = authorized< hasFilters: searchQuery.hasFilters, savedDateFilter: searchQuery.savedDateFilter, publishedDateFilter: searchQuery.publishedDateFilter, + subscriptionFilter: searchQuery.subscriptionFilter, }, claims.uid )) || [[], 0] @@ -859,6 +861,7 @@ export const searchResolver = authorized< hasFilters: searchQuery.hasFilters, savedDateFilter: searchQuery.savedDateFilter, publishedDateFilter: searchQuery.publishedDateFilter, + subscriptionFilter: searchQuery.subscriptionFilter, }, claims.uid )) || [[], 0] diff --git a/packages/api/src/utils/search.ts b/packages/api/src/utils/search.ts index 5ffbc44b8..73fcbef16 100644 --- a/packages/api/src/utils/search.ts +++ b/packages/api/src/utils/search.ts @@ -33,6 +33,7 @@ export type SearchFilter = { hasFilters: HasFilter[] savedDateFilter?: DateRangeFilter publishedDateFilter?: DateRangeFilter + subscriptionFilter?: SubscriptionFilter } export enum LabelFilterType { @@ -71,6 +72,10 @@ export type SortParams = { order?: SortOrder } +export type SubscriptionFilter = { + name: string +} + const parseIsFilter = (str: string | undefined): ReadFilter => { switch (str?.toUpperCase()) { case 'READ': @@ -195,6 +200,18 @@ const parseDateRangeFilter = (str?: string): DateRangeFilter | undefined => { } } +const parseSubscriptionFilter = ( + str?: string +): SubscriptionFilter | undefined => { + if (str === undefined) { + return undefined + } + + return { + name: str.toLowerCase(), + } +} + export const parseSearchQuery = (query: string | undefined): SearchFilter => { const searchQuery = query ? query.replace(/\W\s":/g, '') : undefined const result: SearchFilter = { @@ -225,6 +242,7 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { 'has', 'saved', 'published', + 'subscription', ], tokenize: true, }) @@ -283,6 +301,9 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { case 'published': result.publishedDateFilter = parseDateRangeFilter(keyword.value) break + case 'subscription': + result.subscriptionFilter = parseSubscriptionFilter(keyword.value) + break } } }