diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index 99e1d29cd..e258d2932 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -876,6 +876,7 @@ export const moveToFolderResolver = authorized< { folder, savedAt, + seenAt: new Date(), }, uid, pubsub diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index dfb0e276c..91dbfcbe6 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -657,7 +657,9 @@ export const functionResolvers = { .map((item) => item.id) const libraryItems = ( await ctx.dataLoaders.libraryItems.loadMany(libraryItemIds) - ).filter((libraryItem) => !isError(libraryItem)) as Array + ).filter( + (libraryItem) => !!libraryItem && !isError(libraryItem) + ) as Array const publicItemIds = section.items .filter((item) => item.type === 'public_item') diff --git a/packages/api/src/resolvers/links/index.ts b/packages/api/src/resolvers/links/index.ts index e3b30fa13..783b88e0f 100644 --- a/packages/api/src/resolvers/links/index.ts +++ b/packages/api/src/resolvers/links/index.ts @@ -79,6 +79,7 @@ export const setLinkArchivedResolver = authorized< { state, archivedAt, + seenAt: new Date(), }, uid ) diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 2727cedf5..6d2626f90 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -5,6 +5,8 @@ import { DeepPartial, EntityManager, FindOptionsWhere, + In, + IsNull, ObjectLiteral, } from 'typeorm' import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity' @@ -133,26 +135,34 @@ export enum SortBy { const readingProgressDataSource = new ReadingProgressDataSource() export const batchGetLibraryItems = async (ids: readonly string[]) => { - const items = await findLibraryItemsByIds(ids as string[], undefined, { - select: [ - 'id', - 'title', - 'author', - 'thumbnail', - 'wordCount', - 'savedAt', - 'originalUrl', - 'directionality', - 'description', - 'subscription', - 'siteName', - 'siteIcon', - 'archivedAt', - 'deletedAt', - 'slug', - 'previewContent', - ], - }) + const selectColumns: Array = [ + 'id', + 'title', + 'author', + 'thumbnail', + 'wordCount', + 'savedAt', + 'originalUrl', + 'directionality', + 'description', + 'subscription', + 'siteName', + 'siteIcon', + 'archivedAt', + 'deletedAt', + 'slug', + 'previewContent', + ] + const items = await authTrx(async (tx) => + tx.getRepository(LibraryItem).find({ + select: selectColumns, + where: { + id: In(ids as string[]), + state: LibraryItemState.Succeeded, + seenAt: IsNull(), + }, + }) + ) return ids.map((id) => items.find((item) => item.id === id) || undefined) } @@ -891,6 +901,7 @@ export const softDeleteLibraryItem = async ( await itemRepo.update(id, { state: LibraryItemState.Deleted, deletedAt: new Date(), + seenAt: new Date(), }) return itemRepo.findOneByOrFail({ id })