From bf18c3d3c737ae6e3fb1f47cae0c4c95ad34331a Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Mon, 5 Dec 2022 14:27:46 +0800 Subject: [PATCH 1/2] Add recommendedBy in search result --- packages/api/src/generated/graphql.ts | 21 +++++++++++++++++++++ packages/api/src/generated/schema.graphql | 8 ++++++++ packages/api/src/schema.ts | 8 ++++++++ 3 files changed, 37 insertions(+) diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index fb527d156..d254c1547 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -110,6 +110,7 @@ export type Article = { readAt?: Maybe; readingProgressAnchorIndex: Scalars['Int']; readingProgressPercent: Scalars['Float']; + recommendedBy?: Maybe>; savedAt: Scalars['Date']; savedByViewer?: Maybe; shareInfo?: Maybe; @@ -1796,6 +1797,13 @@ export type RecommendSuccess = { taskNames: Array; }; +export type Recommendation = { + __typename?: 'Recommendation'; + id: Scalars['ID']; + name: Scalars['String']; + recommendedAt: Scalars['Date']; +}; + export type RecommendationGroup = { __typename?: 'RecommendationGroup'; admins: Array; @@ -2038,6 +2046,7 @@ export type SearchItem = { readAt?: Maybe; readingProgressAnchorIndex: Scalars['Int']; readingProgressPercent: Scalars['Float']; + recommendedBy?: Maybe>; savedAt: Scalars['Date']; shortId?: Maybe; siteIcon?: Maybe; @@ -3219,6 +3228,7 @@ export type ResolversTypes = { RecommendInput: RecommendInput; RecommendResult: ResolversTypes['RecommendError'] | ResolversTypes['RecommendSuccess']; RecommendSuccess: ResolverTypeWrapper; + Recommendation: ResolverTypeWrapper; RecommendationGroup: ResolverTypeWrapper; Reminder: ResolverTypeWrapper; ReminderError: ResolverTypeWrapper; @@ -3619,6 +3629,7 @@ export type ResolversParentTypes = { RecommendInput: RecommendInput; RecommendResult: ResolversParentTypes['RecommendError'] | ResolversParentTypes['RecommendSuccess']; RecommendSuccess: RecommendSuccess; + Recommendation: Recommendation; RecommendationGroup: RecommendationGroup; Reminder: Reminder; ReminderError: ReminderError; @@ -3865,6 +3876,7 @@ export type ArticleResolvers, ParentType, ContextType>; readingProgressAnchorIndex?: Resolver; readingProgressPercent?: Resolver; + recommendedBy?: Resolver>, ParentType, ContextType>; savedAt?: Resolver; savedByViewer?: Resolver, ParentType, ContextType>; shareInfo?: Resolver, ParentType, ContextType>; @@ -4821,6 +4833,13 @@ export type RecommendSuccessResolvers; }; +export type RecommendationResolvers = { + id?: Resolver; + name?: Resolver; + recommendedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type RecommendationGroupResolvers = { admins?: Resolver, ParentType, ContextType>; createdAt?: Resolver; @@ -4974,6 +4993,7 @@ export type SearchItemResolvers, ParentType, ContextType>; readingProgressAnchorIndex?: Resolver; readingProgressPercent?: Resolver; + recommendedBy?: Resolver>, ParentType, ContextType>; savedAt?: Resolver; shortId?: Resolver, ParentType, ContextType>; siteIcon?: Resolver, ParentType, ContextType>; @@ -5696,6 +5716,7 @@ export type Resolvers = { RecommendError?: RecommendErrorResolvers; RecommendResult?: RecommendResultResolvers; RecommendSuccess?: RecommendSuccessResolvers; + Recommendation?: RecommendationResolvers; RecommendationGroup?: RecommendationGroupResolvers; Reminder?: ReminderResolvers; ReminderError?: ReminderErrorResolvers; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 41df2df02..00e4a1c98 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -86,6 +86,7 @@ type Article { readAt: Date readingProgressAnchorIndex: Int! readingProgressPercent: Float! + recommendedBy: [Recommendation!] savedAt: Date! savedByViewer: Boolean shareInfo: LinkShareInfo @@ -1258,6 +1259,12 @@ type RecommendSuccess { taskNames: [String!]! } +type Recommendation { + id: ID! + name: String! + recommendedAt: Date! +} + type RecommendationGroup { admins: [User!]! createdAt: Date! @@ -1481,6 +1488,7 @@ type SearchItem { readAt: Date readingProgressAnchorIndex: Int! readingProgressPercent: Float! + recommendedBy: [Recommendation!] savedAt: Date! shortId: String siteIcon: String diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index dda8d9953..fc1267142 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -329,6 +329,12 @@ const schema = gql` updatedAt: Date! } + type Recommendation { + id: ID! + name: String! + recommendedAt: Date! + } + type Article { id: ID! title: String! @@ -369,6 +375,7 @@ const schema = gql` state: ArticleSavingRequestStatus language: String readAt: Date + recommendedBy: [Recommendation!] } # Query: article @@ -1515,6 +1522,7 @@ const schema = gql` savedAt: Date! highlights: [Highlight!] siteIcon: String + recommendedBy: [Recommendation!] } type SearchItemEdge { From c49db571cd95fc6f7b4bf1cbcc68ed5e15534544 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Mon, 5 Dec 2022 14:53:29 +0800 Subject: [PATCH 2/2] 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 + } } } }