From 6b835f0872cf3a913071e749def8a919174770b9 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 28 May 2024 15:02:22 +0800 Subject: [PATCH] batch load sources --- packages/api/src/apollo.ts | 8 +++ packages/api/src/generated/graphql.ts | 4 +- packages/api/src/generated/schema.graphql | 2 +- .../api/src/resolvers/function_resolvers.ts | 52 +++++++++++++------ packages/api/src/resolvers/types.ts | 2 + packages/api/src/schema.ts | 2 +- 6 files changed, 50 insertions(+), 20 deletions(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index d929d5c64..67eb0b65a 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -40,6 +40,7 @@ import { countDailyServiceUsage, createServiceUsage, } from './services/service_usage' +import { findSubscriptionsByNames } from './services/subscriptions' import { batchGetUploadFilesByIds } from './services/upload_file' import { tracer } from './tracing' import { getClaimsByToken, setAuthInCookie } from './utils/auth' @@ -116,6 +117,13 @@ const contextFunc: ContextFunction = async ({ uploadFiles: new DataLoader(batchGetUploadFilesByIds), libraryItems: new DataLoader(batchGetLibraryItems), publicItems: new DataLoader(batchGetPublicItems), + subscriptions: new DataLoader(async (names: readonly string[]) => { + if (!claims?.uid) { + throw new Error('No user id found in claims') + } + + return findSubscriptionsByNames(claims?.uid || '', names as string[]) + }), }, } diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 6a80b3f07..ee60e84b9 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1303,7 +1303,7 @@ export type HomeItem = { previewContent?: Maybe; saveCount?: Maybe; seen_at?: Maybe; - subscription?: Maybe; + source?: Maybe; thumbnail?: Maybe; title: Scalars['String']; url: Scalars['String']; @@ -6043,7 +6043,7 @@ export type HomeItemResolvers, ParentType, ContextType>; saveCount?: Resolver, ParentType, ContextType>; seen_at?: Resolver, ParentType, ContextType>; - subscription?: Resolver, ParentType, ContextType>; + source?: Resolver, ParentType, ContextType>; thumbnail?: Resolver, ParentType, ContextType>; title?: Resolver; url?: Resolver; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 2b09a639f..220808a8a 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -1172,7 +1172,7 @@ type HomeItem { previewContent: String saveCount: Int seen_at: Date - subscription: HomeItemSource + source: HomeItemSource thumbnail: String title: String! url: String! diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index 213a774b7..6f4e84ee9 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -21,6 +21,8 @@ import { Article, Highlight, HomeItem, + HomeItemSource, + HomeItemSourceType, Label, PageType, Recommendation, @@ -29,6 +31,7 @@ import { } from '../generated/graphql' import { getAISummary } from '../services/ai-summaries' import { findUserFeatures } from '../services/features' +import { Merge } from '../util' import { highlightDataToHighlight, isBase64Image, @@ -665,8 +668,10 @@ export const functionResolvers = { canDelete: !libraryItem.deletedAt, canSave: false, dir: libraryItem.directionality, - subscription: null, previewContent: libraryItem.description, + subscription: libraryItem.subscription, + siteName: libraryItem.siteName, + siteIcon: libraryItem.siteIcon, } as HomeItem) ) .concat( @@ -688,29 +693,44 @@ export const functionResolvers = { broadcastCount: publicItem.stats.broadcastCount, likeCount: publicItem.stats.likeCount, saveCount: publicItem.stats.saveCount, - subscription: publicItem.source, + source: publicItem.source, } as HomeItem) ) ) }, }, HomeItem: { - async subscription( - item: HomeItem, + async source( + item: Merge< + HomeItem, + { subscription?: string; siteName: string; siteIcon?: string } + >, _: unknown, ctx: WithDataSourcesContext - ) { - // if (item.subscription) { - // return item.subscription - // } - // const subscription = await ctx.dataLoaders.subscriptions.load(item.id) - // if (!subscription) { - // return { - // name: item.siteName, - // icon: item.siteIcon, - // type: 'rss', - // } - // } + ): Promise { + if (item.source) { + return item.source + } + + if (!item.subscription) { + return { + name: item.siteName, + icon: item.siteIcon, + type: HomeItemSourceType.Library, + } + } + + const subscription = await ctx.dataLoaders.subscriptions.load( + item.subscription + ) + + return { + id: subscription.id, + url: subscription.url, + name: subscription.name, + icon: subscription.icon, + type: subscription.type as unknown as HomeItemSourceType, + } }, }, ...resultResolveTypeResolver('Login'), diff --git a/packages/api/src/resolvers/types.ts b/packages/api/src/resolvers/types.ts index ef6adfeff..21b049bae 100644 --- a/packages/api/src/resolvers/types.ts +++ b/packages/api/src/resolvers/types.ts @@ -11,6 +11,7 @@ import { Label } from '../entity/label' import { LibraryItem } from '../entity/library_item' import { PublicItem } from '../entity/public_item' import { Recommendation } from '../entity/recommendation' +import { Subscription } from '../entity/subscription' import { UploadFile } from '../entity/upload_file' import { HomeItem } from '../generated/graphql' import { PubsubClient } from '../pubsub' @@ -56,6 +57,7 @@ export interface RequestContext { uploadFiles: DataLoader libraryItems: DataLoader publicItems: DataLoader + subscriptions: DataLoader } } diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index ed74e5509..963adf81f 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -3130,7 +3130,7 @@ const schema = gql` dir: String seen_at: Date wordCount: Int - subscription: HomeItemSource + source: HomeItemSource canSave: Boolean canComment: Boolean canShare: Boolean