From ed29721728921386a65c13a69c36f7e24fa48e9a Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 6 Dec 2023 22:06:47 +0800 Subject: [PATCH] fix bulk action query limited to 1000 char --- packages/api/src/resolvers/article/index.ts | 19 ++++++++++-- packages/api/src/services/library_item.ts | 34 ++++++++++++--------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index a1e7c33cb..162dc380f 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -822,8 +822,12 @@ export const bulkActionResolver = authorized< }, }) - // the query size is limited to 255 characters - if (!query || query.length > 255) { + // the query size is limited to 1000 characters + if (!query || query.length > 1000) { + log.error('bulkActionResolver error', { + error: 'QueryTooLong', + query, + }) return { errorCodes: [BulkActionErrorCode.BadRequest] } } @@ -837,7 +841,16 @@ export const bulkActionResolver = authorized< labels = await findLabelsByIds(labelIds, uid) } - await updateLibraryItems(action, query, uid, labels, args) + await updateLibraryItems( + action, + { + query, + useFolders: query.includes('use:folders'), + }, + uid, + labels, + args + ) return { success: true } } catch (error) { diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 3baad9cc3..eaef581b4 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -80,11 +80,11 @@ export interface SearchResultItem { } export enum SortBy { - SAVED = 'saved_at', - UPDATED = 'updated_at', - PUBLISHED = 'published_at', - READ = 'read_at', - WORDS_COUNT = 'word_count', + SAVED = 'saved', + UPDATED = 'updated', + PUBLISHED = 'published', + READ = 'read', + WORDS_COUNT = 'wordsCount', } export enum SortOrder { @@ -102,6 +102,10 @@ interface Select { alias?: string } +const paramtersToObject = (parameters: ObjectLiteral[]) => { + return parameters.reduce((a, b) => ({ ...a, ...b }), {}) +} + export const sortParamsToSort = ( sortParams: InputMaybe | undefined ) => { @@ -688,7 +692,7 @@ export const searchLibraryItems = async ( // add where clause from query queryBuilder .andWhere(query) - .setParameters(parameters.reduce((a, b) => ({ ...a, ...b }), {})) + .setParameters(paramtersToObject(parameters)) } const count = await queryBuilder.getCount() @@ -1011,7 +1015,7 @@ export const countByCreatedAt = async ( export const updateLibraryItems = async ( action: BulkActionType, - query: string, + searchArgs: SearchArgs, userId: string, labels?: Label[], args?: unknown @@ -1065,19 +1069,21 @@ export const updateLibraryItems = async ( throw new Error('Invalid bulk action') } - const searchQuery = parseSearchQuery(query) + if (!searchArgs.query) { + throw new Error('Search query is required') + } + + const searchQuery = parseSearchQuery(searchArgs.query) + const parameters: ObjectLiteral[] = [] + const query = buildQuery(searchQuery, parameters) await authTrx(async (tx) => { const queryBuilder = tx .createQueryBuilder(LibraryItem, 'library_item') .where('library_item.user_id = :userId', { userId }) - const parameters: ObjectLiteral[] = [] - const whereClause = buildQuery(searchQuery, parameters) - if (whereClause) { - queryBuilder - .andWhere(whereClause) - .setParameters(parameters.reduce((a, b) => ({ ...a, ...b }), {})) + if (query) { + queryBuilder.andWhere(query).setParameters(paramtersToObject(parameters)) } if (addLabels) {