Merge pull request #1509 from omnivore-app/search-by-recommendation

search by recommendation
This commit is contained in:
Hongbo Wu 2022-12-05 15:16:57 +08:00 committed by GitHub
commit 55d4c89754
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 79 additions and 0 deletions

View file

@ -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: {

View file

@ -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
}

View file

@ -110,6 +110,7 @@ export type Article = {
readAt?: Maybe<Scalars['Date']>;
readingProgressAnchorIndex: Scalars['Int'];
readingProgressPercent: Scalars['Float'];
recommendedBy?: Maybe<Array<Recommendation>>;
savedAt: Scalars['Date'];
savedByViewer?: Maybe<Scalars['Boolean']>;
shareInfo?: Maybe<LinkShareInfo>;
@ -1796,6 +1797,13 @@ export type RecommendSuccess = {
taskNames: Array<Scalars['String']>;
};
export type Recommendation = {
__typename?: 'Recommendation';
id: Scalars['ID'];
name: Scalars['String'];
recommendedAt: Scalars['Date'];
};
export type RecommendationGroup = {
__typename?: 'RecommendationGroup';
admins: Array<User>;
@ -2038,6 +2046,7 @@ export type SearchItem = {
readAt?: Maybe<Scalars['Date']>;
readingProgressAnchorIndex: Scalars['Int'];
readingProgressPercent: Scalars['Float'];
recommendedBy?: Maybe<Array<Recommendation>>;
savedAt: Scalars['Date'];
shortId?: Maybe<Scalars['String']>;
siteIcon?: Maybe<Scalars['String']>;
@ -3219,6 +3228,7 @@ export type ResolversTypes = {
RecommendInput: RecommendInput;
RecommendResult: ResolversTypes['RecommendError'] | ResolversTypes['RecommendSuccess'];
RecommendSuccess: ResolverTypeWrapper<RecommendSuccess>;
Recommendation: ResolverTypeWrapper<Recommendation>;
RecommendationGroup: ResolverTypeWrapper<RecommendationGroup>;
Reminder: ResolverTypeWrapper<Reminder>;
ReminderError: ResolverTypeWrapper<ReminderError>;
@ -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<ContextType = ResolverContext, ParentType extends R
readAt?: Resolver<Maybe<ResolversTypes['Date']>, ParentType, ContextType>;
readingProgressAnchorIndex?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
readingProgressPercent?: Resolver<ResolversTypes['Float'], ParentType, ContextType>;
recommendedBy?: Resolver<Maybe<Array<ResolversTypes['Recommendation']>>, ParentType, ContextType>;
savedAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
savedByViewer?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
shareInfo?: Resolver<Maybe<ResolversTypes['LinkShareInfo']>, ParentType, ContextType>;
@ -4821,6 +4833,13 @@ export type RecommendSuccessResolvers<ContextType = ResolverContext, ParentType
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type RecommendationResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['Recommendation'] = ResolversParentTypes['Recommendation']> = {
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
recommendedAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type RecommendationGroupResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['RecommendationGroup'] = ResolversParentTypes['RecommendationGroup']> = {
admins?: Resolver<Array<ResolversTypes['User']>, ParentType, ContextType>;
createdAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
@ -4974,6 +4993,7 @@ export type SearchItemResolvers<ContextType = ResolverContext, ParentType extend
readAt?: Resolver<Maybe<ResolversTypes['Date']>, ParentType, ContextType>;
readingProgressAnchorIndex?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
readingProgressPercent?: Resolver<ResolversTypes['Float'], ParentType, ContextType>;
recommendedBy?: Resolver<Maybe<Array<ResolversTypes['Recommendation']>>, ParentType, ContextType>;
savedAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
shortId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
siteIcon?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@ -5696,6 +5716,7 @@ export type Resolvers<ContextType = ResolverContext> = {
RecommendError?: RecommendErrorResolvers<ContextType>;
RecommendResult?: RecommendResultResolvers<ContextType>;
RecommendSuccess?: RecommendSuccessResolvers<ContextType>;
Recommendation?: RecommendationResolvers<ContextType>;
RecommendationGroup?: RecommendationGroupResolvers<ContextType>;
Reminder?: ReminderResolvers<ContextType>;
ReminderError?: ReminderErrorResolvers<ContextType>;

View file

@ -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

View file

@ -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 {

View file

@ -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
}
}
}
}