diff --git a/packages/api/src/elastic/pages.ts b/packages/api/src/elastic/pages.ts index b93406192..c0abb1a54 100644 --- a/packages/api/src/elastic/pages.ts +++ b/packages/api/src/elastic/pages.ts @@ -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, diff --git a/packages/api/src/elastic/types.ts b/packages/api/src/elastic/types.ts index b27cef16d..717ace7ce 100644 --- a/packages/api/src/elastic/types.ts +++ b/packages/api/src/elastic/types.ts @@ -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 } diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index a62cd8c1e..6cfac5b3a 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1737,6 +1737,8 @@ export type QueryRulesArgs = { export type QuerySearchArgs = { after?: InputMaybe; first?: InputMaybe; + format?: InputMaybe; + includeContent?: InputMaybe; query?: InputMaybe; }; @@ -2128,6 +2130,7 @@ export type SearchItem = { __typename?: 'SearchItem'; annotation?: Maybe; author?: Maybe; + content?: Maybe; contentReader: ContentReader; createdAt: Scalars['Date']; description?: Maybe; @@ -5174,6 +5177,7 @@ export type SearchErrorResolvers = { annotation?: Resolver, ParentType, ContextType>; author?: Resolver, ParentType, ContextType>; + content?: Resolver, ParentType, ContextType>; contentReader?: Resolver; createdAt?: Resolver; description?: Resolver, ParentType, ContextType>; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 1d56197f7..abf2a3750 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -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 diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index fee971897..e7ba636a9 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -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, diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 64d84d2d5..d07520a22 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -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!