From 4bf3e4ba0fbbd97e8da76c07d31aa127cbea67de Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 14 Aug 2024 12:59:52 +0800 Subject: [PATCH] delete count cache after bulk action or empty trash --- packages/api/src/resolvers/article/index.ts | 7 +++++++ packages/api/src/services/library_item.ts | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index a5fdfe7e4..4043b657c 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -79,6 +79,7 @@ import { batchUpdateLibraryItems, countLibraryItems, createOrUpdateLibraryItem, + deleteCachedTotalCount, findLibraryItemsByPrefix, SearchArgs, searchLibraryItems, @@ -771,6 +772,8 @@ export const bulkActionResolver = authorized< // if there are less than batchSize items, update them synchronously await batchUpdateLibraryItems(action, searchArgs, uid, labelIds, args) + await deleteCachedTotalCount(uid) + return { success: true } } @@ -790,6 +793,8 @@ export const bulkActionResolver = authorized< return { errorCodes: [BulkActionErrorCode.BadRequest] } } + await deleteCachedTotalCount(uid) + return { success: true } } catch (error) { log.error('bulkActionResolver error', error) @@ -986,6 +991,8 @@ export const emptyTrashResolver = authorized< state: LibraryItemState.Deleted, }) + await deleteCachedTotalCount(uid) + return { success: true, } diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 84886511c..90bd8c3c0 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -1717,9 +1717,10 @@ export const filterItemEvents = ( } const totalCountCacheKey = (userId: string, args: SearchArgs) => { - return `cache:library_items_count:${userId}:${stringToHash( - JSON.stringify(args) - )}` + // sort the args to make sure the cache key is consistent + const sortedArgs = JSON.stringify(args, Object.keys(args).sort()) + + return `cache:library_items_count:${userId}:${stringToHash(sortedArgs)}` } export const getCachedTotalCount = async (userId: string, args: SearchArgs) => { @@ -1740,3 +1741,14 @@ export const setCachedTotalCount = async ( const cacheKey = totalCountCacheKey(userId, args) await redisDataSource.redisClient?.set(cacheKey, count, 'EX', 600) } + +export const deleteCachedTotalCount = async (userId: string) => { + const keyPattern = `cache:library_items_count:${userId}:*` + const keys = await redisDataSource.redisClient?.keys(keyPattern) + if (!keys || keys.length === 0) { + return + } + + console.log('Deleting keys:', keys) + await redisDataSource.redisClient?.del(keys) +}