mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
Merge pull request #1509 from omnivore-app/search-by-recommendation
search by recommendation
This commit is contained in:
commit
55d4c89754
6 changed files with 79 additions and 0 deletions
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue