From d633b8c1c3d0a1d634b1efc4e7943eed48f1fd91 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 13 Aug 2024 10:52:28 +0800 Subject: [PATCH 1/2] cache total count of library items in 60 seconds --- packages/api/src/services/library_item.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 5fa422103..e42dcdb9f 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -704,13 +704,22 @@ export const createSearchQueryBuilder = ( } export const countLibraryItems = async (args: SearchArgs, userId: string) => { - return authTrx( + const cacheKey = `countLibraryItems:${userId}:${JSON.stringify(args)}` + const cachedCount = await redisDataSource.redisClient?.get(cacheKey) + if (cachedCount) { + return parseInt(cachedCount, 10) + } + + const count = await authTrx( async (tx) => createSearchQueryBuilder(args, userId, tx).getCount(), { uid: userId, replicationMode: 'replica', } ) + + await redisDataSource.redisClient?.set(cacheKey, count, 'EX', 60) + return count } export const searchLibraryItems = async ( From 62ecbccd34ec9b09967d9a72bdcdac04786e0ee0 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 13 Aug 2024 12:08:53 +0800 Subject: [PATCH 2/2] fix tests --- packages/api/test/resolvers/article.test.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/api/test/resolvers/article.test.ts b/packages/api/test/resolvers/article.test.ts index 856bbaea3..b1fe5a07a 100644 --- a/packages/api/test/resolvers/article.test.ts +++ b/packages/api/test/resolvers/article.test.ts @@ -27,6 +27,7 @@ import { getRepository } from '../../src/repository' import { createGroup, deleteGroup } from '../../src/services/groups' import { createLabel, deleteLabels } from '../../src/services/labels' import { + countLibraryItems, createLibraryItems, createOrUpdateLibraryItem, CreateOrUpdateLibraryItemArgs, @@ -2451,19 +2452,16 @@ describe('Article API', () => { }) it('empties the trash', async () => { - let response = await graphqlRequest( - searchQuery('in:trash'), - authToken - ).expect(200) - expect(response.body.data.search.pageInfo.totalCount).to.eql(5) - await graphqlRequest(emptyTrashQuery(), authToken).expect(200) - response = await graphqlRequest( - searchQuery('in:trash'), - authToken - ).expect(200) - expect(response.body.data.search.pageInfo.totalCount).to.eql(0) + const count = await countLibraryItems( + { + query: 'in:trash', + includeDeleted: true, + }, + user.id + ) + expect(count).to.eql(0) }) }) })