Fetch markdown content if specified in search API

This commit is contained in:
Hongbo Wu
2023-01-05 17:17:09 +08:00
parent 7b749f974d
commit e28c9b10bb
6 changed files with 25 additions and 4 deletions

View File

@ -388,6 +388,7 @@ export const searchPages = async (
termFilters,
matchFilters,
ids,
includeContent,
} = args
// default order is descending
const sortOrder = sort?.order || SortOrder.DESCENDING
@ -424,7 +425,7 @@ export const searchPages = async (
from,
size,
_source: {
excludes: ['originalHtml', 'content'],
excludes: includeContent ? [] : ['originalHtml', 'content'],
},
}
@ -497,7 +498,7 @@ export const searchPages = async (
return [
response.body.hits.hits.map((hit: { _source: Page; _id: string }) => ({
...hit._source,
content: '',
content: includeContent ? hit._source.content : '',
id: hit._id,
})),
response.body.hits.total.value,

View File

@ -286,6 +286,7 @@ export interface SearchItem {
siteName?: string
siteIcon?: string
recommendations?: Recommendation[]
content?: string
}
const keys = ['_id', 'url', 'slug', 'userId', 'uploadFileId', 'state'] as const
@ -315,4 +316,5 @@ export interface PageSearchArgs {
includeDeleted?: boolean
ids?: string[]
recommendedBy?: string
includeContent?: boolean
}

View File

@ -1737,6 +1737,8 @@ export type QueryRulesArgs = {
export type QuerySearchArgs = {
after?: InputMaybe<Scalars['String']>;
first?: InputMaybe<Scalars['Int']>;
format?: InputMaybe<Scalars['String']>;
includeContent?: InputMaybe<Scalars['Boolean']>;
query?: InputMaybe<Scalars['String']>;
};
@ -2128,6 +2130,7 @@ export type SearchItem = {
__typename?: 'SearchItem';
annotation?: Maybe<Scalars['String']>;
author?: Maybe<Scalars['String']>;
content?: Maybe<Scalars['String']>;
contentReader: ContentReader;
createdAt: Scalars['Date'];
description?: Maybe<Scalars['String']>;
@ -5174,6 +5177,7 @@ export type SearchErrorResolvers<ContextType = ResolverContext, ParentType exten
export type SearchItemResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['SearchItem'] = ResolversParentTypes['SearchItem']> = {
annotation?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
author?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
content?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
contentReader?: Resolver<ResolversTypes['ContentReader'], ParentType, ContextType>;
createdAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;

View File

@ -1219,7 +1219,7 @@ type Query {
recentSearches: RecentSearchesResult!
reminder(linkId: ID!): ReminderResult!
rules(enabled: Boolean): RulesResult!
search(after: String, first: Int, query: String): SearchResult!
search(after: String, first: Int, format: String, includeContent: Boolean, query: String): SearchResult!
sendInstallInstructions: SendInstallInstructionsResult!
sharedArticle(selectedHighlightId: String, slug: String!, username: String!): SharedArticleResult!
subscriptions(sort: SortParams): SubscriptionsResult!
@ -1548,6 +1548,7 @@ enum SearchErrorCode {
type SearchItem {
annotation: String
author: String
content: String
contentReader: ContentReader!
createdAt: Date!
description: String

View File

@ -874,6 +874,7 @@ export const searchResolver = authorized<
size: first + 1, // fetch one more item to get next cursor
sort: searchQuery.sortParams,
includePending: true,
includeContent: params.includeContent ?? false,
...searchQuery,
},
claims.uid
@ -895,6 +896,11 @@ export const searchResolver = authorized<
if (siteIcon && !isBase64Image(siteIcon)) {
siteIcon = createImageProxyUrl(siteIcon, 128, 128)
}
if (params.includeContent && params.format === 'markdown' && r.content) {
r.content = htmlToMarkdown(r.content)
}
return {
node: {
...r,

View File

@ -1550,6 +1550,7 @@ const schema = gql`
siteIcon: String
recommendations: [Recommendation!]
wordsCount: Int
content: String
}
type SearchItemEdge {
@ -2453,7 +2454,13 @@ const schema = gql`
newsletterEmails: NewsletterEmailsResult!
reminder(linkId: ID!): ReminderResult!
labels: LabelsResult!
search(after: String, first: Int, query: String): SearchResult!
search(
after: String
first: Int
query: String
includeContent: Boolean
format: String
): SearchResult!
subscriptions(sort: SortParams): SubscriptionsResult!
sendInstallInstructions: SendInstallInstructionsResult!
webhooks: WebhooksResult!