diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index 52bdfad0b..a5fdfe7e4 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -665,7 +665,10 @@ export const typeaheadSearchResolver = authorized< }) export const updatesSinceResolver = authorized< - Merge }>, + Merge< + UpdatesSinceSuccess, + { edges: Array; pageInfo: PartialPageInfo } + >, UpdatesSinceError, QueryUpdatesSinceArgs >(async (_obj, { since, first, after, sort: sortParams, folder }, { uid }) => { @@ -683,16 +686,15 @@ export const updatesSinceResolver = authorized< folder ? ' in:' + folder : '' } sort:${sort.by}-${sort.order}` - const libraryItems = await searchLibraryItems( - { - from: Number(startCursor), - size: size + 1, // fetch one more item to get next cursor - includeDeleted: true, - query, - includeContent: true, // by default include content for offline use for now - }, - uid - ) + const searchLibraryItemArgs = { + from: Number(startCursor), + size: size + 1, // fetch one more item to get next cursor + includeDeleted: true, + query, + includeContent: true, // by default include content for offline use for now + } + + const libraryItems = await searchLibraryItems(searchLibraryItemArgs, uid) const start = startCursor && !isNaN(Number(startCursor)) ? Number(startCursor) : 0 @@ -722,6 +724,7 @@ export const updatesSinceResolver = authorized< startCursor, hasNextPage, endCursor, + searchLibraryItemArgs, }, } }) diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index f38352c82..485187ecf 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -28,11 +28,17 @@ import { PageType, User, } from '../generated/graphql' +import { redisDataSource } from '../redis_data_source' import { getAISummary } from '../services/ai-summaries' import { findUserFeatures } from '../services/features' import { countLibraryItems } from '../services/library_item' import { Merge } from '../util' -import { isBase64Image, validatedDate, wordsCount } from '../utils/helpers' +import { + isBase64Image, + stringToHash, + validatedDate, + wordsCount, +} from '../utils/helpers' import { createImageProxyUrl } from '../utils/imageproxy' import { contentConverter } from '../utils/parser' import { @@ -599,7 +605,20 @@ export const functionResolvers = { if (pageInfo.totalCount) return pageInfo.totalCount if (pageInfo.searchLibraryItemArgs && ctx.claims) { - return countLibraryItems(pageInfo.searchLibraryItemArgs, ctx.claims.uid) + const args = pageInfo.searchLibraryItemArgs + const userId = ctx.claims.uid + // hash the arguments to create a unique cache key + const argsHash = stringToHash(JSON.stringify(args)) + const cacheKey = `countLibraryItems:${userId}:${argsHash}` + const cachedCount = await redisDataSource.redisClient?.get(cacheKey) + if (cachedCount) { + return parseInt(cachedCount, 10) + } + + const count = await countLibraryItems(args, userId) + + await redisDataSource.redisClient?.set(cacheKey, count, 'EX', 600) + return count } return 0 diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 8c6b46a9d..5fa422103 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -35,7 +35,6 @@ import { logger } from '../utils/logger' import { parseSearchQuery } from '../utils/search' import { HighlightEvent } from './highlights' import { addLabelsToLibraryItem, LabelEvent } from './labels' -import { stringToHash } from '../utils/helpers' const columnsToDelete = [ 'user', @@ -705,24 +704,13 @@ export const createSearchQueryBuilder = ( } export const countLibraryItems = async (args: SearchArgs, userId: string) => { - // hash the arguments to create a unique cache key - const argsHash = stringToHash(JSON.stringify(args)) - const cacheKey = `countLibraryItems:${userId}:${argsHash}` - const cachedCount = await redisDataSource.redisClient?.get(cacheKey) - if (cachedCount) { - return parseInt(cachedCount, 10) - } - - const count = await authTrx( + return authTrx( async (tx) => createSearchQueryBuilder(args, userId, tx).getCount(), { uid: userId, replicationMode: 'replica', } ) - - await redisDataSource.redisClient?.set(cacheKey, count, 'EX', 600) - return count } export const searchLibraryItems = async (