fix subscription and public item orders too

This commit is contained in:
Hongbo Wu
2024-05-29 11:30:19 +08:00
parent 3b69f0ce0c
commit 7a34a03bdd
5 changed files with 28 additions and 64 deletions

View File

@ -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<ExpressContext, ResolverContext> = async ({
throw new Error('No user id found in claims')
}
return findSubscriptionsByNames(claims?.uid || '', names as string[])
return batchGetSubscriptionsByNames(claims.uid, names as string[])
}),
},
}

View File

@ -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<LibraryItem>
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,

View File

@ -57,7 +57,7 @@ export interface RequestContext {
uploadFiles: DataLoader<string, UploadFile | undefined>
libraryItems: DataLoader<string, LibraryItem | undefined>
publicItems: DataLoader<string, PublicItem | undefined>
subscriptions: DataLoader<string, Subscription>
subscriptions: DataLoader<string, Subscription | undefined>
}
}

View File

@ -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<Array<PublicItem>> => {
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<Array<HomeItem>> => {
const libraryItems = await findLibraryItemsByIds(ids as string[])
): Promise<Array<PublicItem | undefined>> => {
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<HomeItem>
return ids.map((id) => publicItems.find((pi) => pi.id === id))
}
export const findUnseenPublicItems = async (

View File

@ -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'