From aea16506263c666e59da5a4f78dbcabeccd8ae35 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 14 Jun 2024 12:15:17 +0800 Subject: [PATCH 1/2] do not show move/archived/deleted item in home feed --- packages/api/src/resolvers/article/index.ts | 1 + .../api/src/resolvers/function_resolvers.ts | 4 +- packages/api/src/resolvers/links/index.ts | 1 + packages/api/src/services/library_item.ts | 51 +++++++++++-------- 4 files changed, 36 insertions(+), 21 deletions(-) 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 }) From c0947ddd48a75e9a8d767151dd0fb256af4f5407 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 14 Jun 2024 12:21:20 +0800 Subject: [PATCH 2/2] fix batch delete query does not use index --- packages/api/src/resolvers/article/index.ts | 2 +- packages/api/src/services/library_item.ts | 24 --------------------- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index e258d2932..0fd905bf7 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -970,10 +970,10 @@ export const emptyTrashResolver = authorized< }) await batchDelete({ - state: LibraryItemState.Deleted, user: { id: uid, }, + state: LibraryItemState.Deleted, }) return { diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 6d2626f90..4ed0136a6 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -1392,30 +1392,6 @@ export const batchDelete = async (criteria: FindOptionsWhere) => { return authTrx(async (t) => t.query(sql)) } -export const batchDeleteAllTrash = async () => { - const sql = ` - DO $$ - DECLARE - user_record RECORD; - user_cursor CURSOR FOR SELECT id FROM omnivore.user WHERE status = 'ACTIVE'; -- Adjust the condition as needed - BEGIN - OPEN user_cursor; - - LOOP - FETCH NEXT FROM user_cursor INTO user_record; - EXIT WHEN NOT FOUND; - - DELETE FROM omnivore.library_item WHERE user_id = user_record.id AND state = 'DELETED' AND deleted_at < '2023-01-01'; - - RETURN NEXT; - END LOOP; - - CLOSE user_cursor; - END $$;` - - return authTrx(async (t) => t.query(sql)) -} - export const findLibraryItemIdsByLabelId = async ( labelId: string, userId: string