From 641f191fcda2a6e58f1294373da7f237d5d1667f Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 24 May 2022 18:23:30 +0800 Subject: [PATCH 1/4] Add published sort param in schema --- packages/api/src/generated/graphql.ts | 1 + packages/api/src/generated/schema.graphql | 1 + packages/api/src/schema.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index fd414ea98..ba186277a 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1634,6 +1634,7 @@ export type SignupSuccess = { }; export enum SortBy { + PublishedAt = 'PUBLISHED_AT', SavedAt = 'SAVED_AT', Score = 'SCORE', UpdatedTime = 'UPDATED_TIME' diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index a399f9dbd..d20b87d1e 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -1215,6 +1215,7 @@ type SignupSuccess { } enum SortBy { + PUBLISHED_AT SAVED_AT SCORE UPDATED_TIME diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index f910324de..e9d02554e 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -29,6 +29,7 @@ const schema = gql` UPDATED_TIME SCORE SAVED_AT + PUBLISHED_AT } enum ContentReader { From 61065efd2bdcc06829f456391d85d437b6a8e9b8 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 24 May 2022 18:24:30 +0800 Subject: [PATCH 2/4] Add published sort param in elastic query --- packages/api/src/elastic/pages.ts | 56 ++++++++++--------------------- packages/api/src/elastic/types.ts | 7 +--- 2 files changed, 19 insertions(+), 44 deletions(-) diff --git a/packages/api/src/elastic/pages.ts b/packages/api/src/elastic/pages.ts index f12d8da1d..5d6f41697 100644 --- a/packages/api/src/elastic/pages.ts +++ b/packages/api/src/elastic/pages.ts @@ -8,7 +8,7 @@ import { SearchResponse, } from './types' import { - DateRangeFilter, + DateFilter, HasFilter, InFilter, LabelFilter, @@ -145,31 +145,16 @@ const appendIncludeLabelFilter = ( }) } -const appendSavedDateFilter = ( - body: SearchBody, - filter: DateRangeFilter -): void => { - body.query.bool.filter.push({ - range: { - savedAt: { - gt: filter.startDate, - lt: filter.endDate, +const appendDateFilters = (body: SearchBody, filters: DateFilter[]): void => { + filters.forEach((filter) => { + body.query.bool.filter.push({ + range: { + [filter.field]: { + gt: filter.startDate, + lt: filter.endDate, + }, }, - }, - }) -} - -const appendPublishedDateFilter = ( - body: SearchBody, - filter: DateRangeFilter -): void => { - body.query.bool.filter.push({ - range: { - publishedAt: { - gt: filter.startDate, - lt: filter.endDate, - }, - }, + }) }) } @@ -350,10 +335,9 @@ export const searchPages = async ( inFilter?: InFilter readFilter?: ReadFilter typeFilter?: PageType - labelFilters?: LabelFilter[] - hasFilters?: HasFilter[] - savedDateFilter?: DateRangeFilter - publishedDateFilter?: DateRangeFilter + labelFilters: LabelFilter[] + hasFilters: HasFilter[] + dateFilters: DateFilter[] subscriptionFilter?: SubscriptionFilter includePending?: boolean | null }, @@ -367,11 +351,10 @@ export const searchPages = async ( query, readFilter = ReadFilter.ALL, typeFilter, - labelFilters = [], + labelFilters, inFilter = InFilter.ALL, - hasFilters = [], - savedDateFilter, - publishedDateFilter, + hasFilters, + dateFilters, subscriptionFilter, } = args // default order is descending @@ -435,11 +418,8 @@ export const searchPages = async ( if (excludeLabels.length > 0) { appendExcludeLabelFilter(body, excludeLabels) } - if (savedDateFilter) { - appendSavedDateFilter(body, savedDateFilter) - } - if (publishedDateFilter) { - appendPublishedDateFilter(body, publishedDateFilter) + if (dateFilters.length > 0) { + appendDateFilters(body, dateFilters) } if (subscriptionFilter) { appendSubscriptionFilter(body, subscriptionFilter) diff --git a/packages/api/src/elastic/types.ts b/packages/api/src/elastic/types.ts index cd829d54a..19e07391c 100644 --- a/packages/api/src/elastic/types.ts +++ b/packages/api/src/elastic/types.ts @@ -25,12 +25,7 @@ export interface SearchBody { } | { range: { - savedAt: { gt: Date | undefined } | { lt: Date | undefined } - } - } - | { - range: { - publishedAt: { gt: Date | undefined } | { lt: Date | undefined } + [K: string]: { gt: Date | undefined } | { lt: Date | undefined } } } | { From a35b096d73f03c9878d0d981464b849c9e6be5a3 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 24 May 2022 18:25:32 +0800 Subject: [PATCH 3/4] Support sort and filter by published in resolver --- packages/api/src/resolvers/article/index.ts | 41 ++------------------- packages/api/src/utils/search.ts | 38 ++++++++++++++----- 2 files changed, 33 insertions(+), 46 deletions(-) diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index a2bedd1ff..69ce55743 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -448,16 +448,7 @@ export const getArticlesResolver = authorized< event: 'get_articles', properties: { env: env.server.apiEnv, - query: searchQuery.query, - inFilter: searchQuery.inFilter, - readFilter: searchQuery.readFilter, - typeFilter: searchQuery.typeFilter, - labelFilters: searchQuery.labelFilters, - sortParams: searchQuery.sortParams, - hasFilters: searchQuery.hasFilters, - savedDateFilter: searchQuery.savedDateFilter, - publishedDateFilter: searchQuery.publishedDateFilter, - subscriptionFilter: searchQuery.subscriptionFilter, + ...searchQuery, }, }) @@ -466,16 +457,8 @@ export const getArticlesResolver = authorized< from: Number(startCursor), size: first + 1, // fetch one more item to get next cursor sort: searchQuery.sortParams, - query: searchQuery.query, - inFilter: searchQuery.inFilter, - readFilter: searchQuery.readFilter, - typeFilter: searchQuery.typeFilter, - labelFilters: searchQuery.labelFilters, - hasFilters: searchQuery.hasFilters, - savedDateFilter: searchQuery.savedDateFilter, - publishedDateFilter: searchQuery.publishedDateFilter, - subscriptionFilter: searchQuery.subscriptionFilter, includePending: params.includePending, + ...searchQuery, }, claims.uid )) || [[], 0] @@ -818,16 +801,8 @@ export const searchResolver = authorized< userId: claims.uid, event: 'search', properties: { - query: searchQuery.query, - inFilter: searchQuery.inFilter, - readFilter: searchQuery.readFilter, - typeFilter: searchQuery.typeFilter, - labelFilters: searchQuery.labelFilters, - sortParams: searchQuery.sortParams, - hasFilters: searchQuery.hasFilters, - savedDateFilter: searchQuery.savedDateFilter, - publishedDateFilter: searchQuery.publishedDateFilter, env: env.server.apiEnv, + ...searchQuery, }, }) @@ -853,16 +828,8 @@ export const searchResolver = authorized< from: Number(startCursor), size: first + 1, // fetch one more item to get next cursor sort: searchQuery.sortParams, - query: searchQuery.query, - inFilter: searchQuery.inFilter, - readFilter: searchQuery.readFilter, - typeFilter: searchQuery.typeFilter, - labelFilters: searchQuery.labelFilters, - hasFilters: searchQuery.hasFilters, - savedDateFilter: searchQuery.savedDateFilter, - publishedDateFilter: searchQuery.publishedDateFilter, - subscriptionFilter: searchQuery.subscriptionFilter, includePending: true, + ...searchQuery, }, claims.uid )) || [[], 0] diff --git a/packages/api/src/utils/search.ts b/packages/api/src/utils/search.ts index 73fcbef16..c1fa1c7f4 100644 --- a/packages/api/src/utils/search.ts +++ b/packages/api/src/utils/search.ts @@ -31,8 +31,7 @@ export type SearchFilter = { labelFilters: LabelFilter[] sortParams?: SortParams hasFilters: HasFilter[] - savedDateFilter?: DateRangeFilter - publishedDateFilter?: DateRangeFilter + dateFilters: DateFilter[] subscriptionFilter?: SubscriptionFilter } @@ -51,7 +50,8 @@ export enum HasFilter { SHARED_AT, } -export type DateRangeFilter = { +export interface DateFilter { + field: string startDate?: Date endDate?: Date } @@ -60,6 +60,7 @@ export enum SortBy { SAVED = 'savedAt', UPDATED = 'updatedAt', SCORE = '_score', + PUBLISHED = 'publishedAt', } export enum SortOrder { @@ -67,7 +68,7 @@ export enum SortOrder { DESCENDING = 'desc', } -export type SortParams = { +export interface SortParams { by: SortBy order?: SortOrder } @@ -171,6 +172,11 @@ const parseSortParams = (str?: string): SortParams | undefined => { return { by: SortBy.SCORE, } + case 'PUBLISHED': + return { + by: SortBy.PUBLISHED, + order: sortOrder, + } } } @@ -185,7 +191,10 @@ const parseHasFilter = (str?: string): HasFilter | undefined => { } } -const parseDateRangeFilter = (str?: string): DateRangeFilter | undefined => { +const parseDateFilter = ( + field: string, + str?: string +): DateFilter | undefined => { if (str === undefined) { return undefined } @@ -194,7 +203,16 @@ const parseDateRangeFilter = (str?: string): DateRangeFilter | undefined => { const startDate = start && start !== '*' ? new Date(start) : undefined const endDate = end && end !== '*' ? new Date(end) : undefined + switch (field.toUpperCase()) { + case 'PUBLISHED': + field = 'publishedAt' + break + case 'SAVED': + field = 'savedAt' + } + return { + field, startDate, endDate, } @@ -220,6 +238,7 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { inFilter: searchQuery ? InFilter.ALL : InFilter.INBOX, labelFilters: [], hasFilters: [], + dateFilters: [], } if (!searchQuery) { @@ -229,6 +248,7 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { readFilter: ReadFilter.ALL, labelFilters: [], hasFilters: [], + dateFilters: [], } } @@ -296,11 +316,11 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { break } case 'saved': - result.savedDateFilter = parseDateRangeFilter(keyword.value) - break - case 'published': - result.publishedDateFilter = parseDateRangeFilter(keyword.value) + case 'published': { + const dateFilter = parseDateFilter(keyword.keyword, keyword.value) + dateFilter && result.dateFilters.push(dateFilter) break + } case 'subscription': result.subscriptionFilter = parseSubscriptionFilter(keyword.value) break From aad8539b43f6122b153bf30fb25a5e6727e07ce3 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 24 May 2022 18:39:21 +0800 Subject: [PATCH 4/4] Fix tests --- packages/api/test/elastic/index.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/api/test/elastic/index.test.ts b/packages/api/test/elastic/index.test.ts index c313ad556..c899c88e6 100644 --- a/packages/api/test/elastic/index.test.ts +++ b/packages/api/test/elastic/index.test.ts @@ -148,6 +148,8 @@ describe('elastic api', () => { it('searches pages', async () => { const searchResults = await searchPages( { + dateFilters: [], + hasFilters: [], inFilter: InFilter.ALL, labelFilters: [], readFilter: ReadFilter.ALL,