From 7a34a03bddc59d53e91bd4705e43cbaef601bb83 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 29 May 2024 11:30:19 +0800 Subject: [PATCH] fix subscription and public item orders too --- packages/api/src/apollo.ts | 4 +- .../api/src/resolvers/function_resolvers.ts | 12 ++++ packages/api/src/resolvers/types.ts | 2 +- packages/api/src/services/home.ts | 63 +------------------ packages/api/src/services/subscriptions.ts | 11 ++++ 5 files changed, 28 insertions(+), 64 deletions(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index 67eb0b65a..9c0ce1271 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -40,7 +40,7 @@ import { countDailyServiceUsage, createServiceUsage, } from './services/service_usage' -import { findSubscriptionsByNames } from './services/subscriptions' +import { batchGetSubscriptionsByNames } from './services/subscriptions' import { batchGetUploadFilesByIds } from './services/upload_file' import { tracer } from './tracing' import { getClaimsByToken, setAuthInCookie } from './utils/auth' @@ -122,7 +122,7 @@ const contextFunc: ContextFunction = async ({ throw new Error('No user id found in claims') } - return findSubscriptionsByNames(claims?.uid || '', names as string[]) + return batchGetSubscriptionsByNames(claims.uid, names as string[]) }), }, } diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index e79c60d48..d29f6229e 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -640,13 +640,16 @@ export const functionResolvers = { ctx: WithDataSourcesContext ) { const items = section.items + console.log('items', items) const libraryItemIds = items .filter((item) => item.type === 'library_item') .map((item) => item.id) + console.log('libraryItemIds', libraryItemIds) const libraryItems = ( await ctx.dataLoaders.libraryItems.loadMany(libraryItemIds) ).filter((libraryItem) => !isError(libraryItem)) as Array + console.log('libraryItems', libraryItems) const publicItemIds = section.items .filter((item) => item.type === 'public_item') @@ -657,9 +660,11 @@ export const functionResolvers = { return items .map((item) => { + console.log('item', item) const libraryItem = libraryItems.find( (libraryItem) => item.id === libraryItem.id ) + console.log('libraryItem', libraryItem) if (libraryItem) { return { id: libraryItem.id, @@ -736,6 +741,13 @@ export const functionResolvers = { const subscription = await ctx.dataLoaders.subscriptions.load( item.subscription ) + if (!subscription) { + return { + name: item.siteName, + icon: item.siteIcon, + type: HomeItemSourceType.Library, + } + } return { id: subscription.id, diff --git a/packages/api/src/resolvers/types.ts b/packages/api/src/resolvers/types.ts index b296acd4b..7aaf46322 100644 --- a/packages/api/src/resolvers/types.ts +++ b/packages/api/src/resolvers/types.ts @@ -57,7 +57,7 @@ export interface RequestContext { uploadFiles: DataLoader libraryItems: DataLoader publicItems: DataLoader - subscriptions: DataLoader + subscriptions: DataLoader } } diff --git a/packages/api/src/services/home.ts b/packages/api/src/services/home.ts index c70a98003..b78772377 100644 --- a/packages/api/src/services/home.ts +++ b/packages/api/src/services/home.ts @@ -1,77 +1,18 @@ import { PublicItem } from '../entity/public_item' -import { HomeItem } from '../generated/graphql' import { authTrx } from '../repository' -import { findLibraryItemsByIds } from './library_item' export const batchGetPublicItems = async ( ids: readonly string[] -): Promise> => { - return authTrx(async (tx) => - tx - .getRepository(PublicItem) - .createQueryBuilder('public_item') - .where('public_item.id IN (:...ids)', { ids }) - .getMany() - ) -} - -export const batchGetHomeItems = async ( - ids: readonly string[] -): Promise> => { - const libraryItems = await findLibraryItemsByIds(ids as string[]) - +): Promise> => { const publicItems = await authTrx(async (tx) => tx .getRepository(PublicItem) .createQueryBuilder('public_item') - .innerJoin( - 'public_item_stats', - 'stats', - 'stats.public_item_id = public_item.id' - ) - .innerJoin( - 'public_item_source', - 'source', - 'source.id = public_item.source_id' - ) .where('public_item.id IN (:...ids)', { ids }) .getMany() ) - return ids - .map((id) => { - const libraryItem = libraryItems.find((li) => li.id === id) - if (libraryItem) { - return { - ...libraryItem, - date: libraryItem.savedAt, - url: libraryItem.originalUrl, - canArchive: !libraryItem.archivedAt, - canDelete: !libraryItem.deletedAt, - canSave: false, - dir: libraryItem.directionality, - subscription: null, - previewContent: libraryItem.description, - } as HomeItem - } else { - const publicItem = publicItems.find((pi) => pi.id === id) - return publicItem - ? ({ - ...publicItem, - date: publicItem.createdAt, - url: publicItem.url, - canArchive: false, - canDelete: false, - canSave: true, - broadcastCount: publicItem.stats.broadcastCount, - likeCount: publicItem.stats.likeCount, - saveCount: publicItem.stats.saveCount, - subscription: publicItem.source, - } as HomeItem) - : undefined - } - }) - .filter((item) => item !== undefined) as Array + return ids.map((id) => publicItems.find((pi) => pi.id === id)) } export const findUnseenPublicItems = async ( diff --git a/packages/api/src/services/subscriptions.ts b/packages/api/src/services/subscriptions.ts index 72b0fc9d2..52f4bef50 100644 --- a/packages/api/src/services/subscriptions.ts +++ b/packages/api/src/services/subscriptions.ts @@ -21,6 +21,17 @@ interface SaveSubscriptionInput { export const UNSUBSCRIBE_EMAIL_TEXT = 'This message was automatically generated by Omnivore.' +export const batchGetSubscriptionsByNames = async ( + userId: string, + names: string[] +) => { + const subscriptions = await findSubscriptionsByNames(userId, names) + + return names.map((name) => + subscriptions.find((s) => s?.name === name || s?.url === name) + ) +} + export const parseUnsubscribeMailTo = (unsubscribeMailTo: string) => { const parsed = new URL(`mailto://${unsubscribeMailTo}`) const subject = parsed.searchParams.get('subject') || 'Unsubscribe'