From 1697f11e7563095eaeea18dae636cc83adb35d75 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 8 Dec 2023 16:49:07 +0800 Subject: [PATCH 1/5] wrap the where query in parenthesis because we also need to check user_id --- packages/api/src/services/library_item.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 6cf3f67e7..0f29b6069 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -691,7 +691,7 @@ export const searchLibraryItems = async ( if (query) { // add where clause from query queryBuilder - .andWhere(query) + .andWhere(`(${query})`) .setParameters(paramtersToObject(parameters)) } From 5e566d450ea837c118fa8e4cbc990c8abe782ba6 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 8 Dec 2023 16:50:39 +0800 Subject: [PATCH 2/5] update bulk action api --- packages/api/src/services/library_item.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 0f29b6069..206a10967 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -1083,7 +1083,9 @@ export const updateLibraryItems = async ( .where('library_item.user_id = :userId', { userId }) if (query) { - queryBuilder.andWhere(query).setParameters(paramtersToObject(parameters)) + queryBuilder + .andWhere(`(${query})`) + .setParameters(paramtersToObject(parameters)) } if (addLabels) { From dc9268d6682b7d8f265ea4f09a4f34036eccf140 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 8 Dec 2023 17:05:24 +0800 Subject: [PATCH 3/5] add test cases --- packages/api/test/resolvers/article.test.ts | 55 +++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/packages/api/test/resolvers/article.test.ts b/packages/api/test/resolvers/article.test.ts index e46e24c5d..38ab9f21a 100644 --- a/packages/api/test/resolvers/article.test.ts +++ b/packages/api/test/resolvers/article.test.ts @@ -1757,6 +1757,61 @@ describe('Article API', () => { expect(res.body.data.search.edges[1].node.id).to.eq(items[0].id) }) }) + + context('when label:test1 OR label:test2 is in the query', () => { + let items: LibraryItem[] = [] + let label1: Label + let label2: Label + + before(async () => { + keyword = 'label:test1 OR label:test2' + // Create some test items + label1 = await createLabel('test1', '', user.id) + label2 = await createLabel('test2', '', user.id) + items = await createLibraryItems( + [ + { + user, + title: 'test title 1', + readableContent: '

test 1

', + slug: 'test slug 1', + originalUrl: `${url}/test1`, + }, + { + user, + title: 'test title 2', + readableContent: '

test 2

', + slug: 'test slug 2', + originalUrl: `${url}/test2`, + }, + { + user, + title: 'test title 3', + readableContent: '

test 3

', + slug: 'test slug 3', + originalUrl: `${url}/test3`, + }, + ], + user.id + ) + await saveLabelsInLibraryItem([label1], items[0].id, user.id) + await saveLabelsInLibraryItem([label2], items[1].id, user.id) + }) + + after(async () => { + await deleteLabels({ id: label1.id }, user.id) + await deleteLabels({ id: label2.id }, user.id) + await deleteLibraryItems(items, user.id) + }) + + it('returns items with label test1 or test2', async () => { + const res = await graphqlRequest(query, authToken).expect(200) + + expect(res.body.data.search.pageInfo.totalCount).to.eq(2) + expect(res.body.data.search.edges[0].node.id).to.eq(items[1].id) + expect(res.body.data.search.edges[1].node.id).to.eq(items[0].id) + }) + }) }) describe('TypeaheadSearch API', () => { From da3fede3a4405b096de86d9fa9d2757e840ef486 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 8 Dec 2023 19:58:41 +0800 Subject: [PATCH 4/5] fix saved search bug: undefined category in input --- packages/api/src/generated/graphql.ts | 4 ++++ packages/api/src/generated/schema.graphql | 3 +++ packages/api/src/resolvers/filters/index.ts | 1 + packages/api/src/schema.ts | 3 +++ packages/web/lib/networking/fragments/savedSearchFragment.ts | 4 ++++ packages/web/lib/networking/mutations/saveFilterMutation.ts | 3 +++ packages/web/lib/networking/mutations/updateFilterMutation.ts | 1 + 7 files changed, 19 insertions(+) diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index d485da3a2..e5c815027 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -815,6 +815,7 @@ export type FeedsSuccess = { export type Filter = { __typename?: 'Filter'; + category?: Maybe; createdAt: Scalars['Date']; defaultFilter?: Maybe; description?: Maybe; @@ -2238,6 +2239,7 @@ export enum SaveFilterErrorCode { } export type SaveFilterInput = { + category?: InputMaybe; description?: InputMaybe; filter: Scalars['String']; folder?: InputMaybe; @@ -2902,6 +2904,7 @@ export enum UpdateFilterErrorCode { } export type UpdateFilterInput = { + category?: InputMaybe; description?: InputMaybe; filter?: InputMaybe; folder?: InputMaybe; @@ -4967,6 +4970,7 @@ export type FeedsSuccessResolvers = { + category?: Resolver, ParentType, ContextType>; createdAt?: Resolver; defaultFilter?: Resolver, ParentType, ContextType>; description?: Resolver, ParentType, ContextType>; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 15cb6e347..816abbd5a 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -722,6 +722,7 @@ type FeedsSuccess { } type Filter { + category: String createdAt: Date! defaultFilter: Boolean description: String @@ -1691,6 +1692,7 @@ enum SaveFilterErrorCode { } input SaveFilterInput { + category: String description: String filter: String! folder: String @@ -2306,6 +2308,7 @@ enum UpdateFilterErrorCode { } input UpdateFilterInput { + category: String description: String filter: String folder: String diff --git a/packages/api/src/resolvers/filters/index.ts b/packages/api/src/resolvers/filters/index.ts index 052a4d299..8a8187715 100644 --- a/packages/api/src/resolvers/filters/index.ts +++ b/packages/api/src/resolvers/filters/index.ts @@ -43,6 +43,7 @@ export const saveFilterResolver = authorized< filter: input.filter, defaultFilter: false, visible: true, + category: input.category ?? 'Search', }) }) diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index aba01f9e2..b84976126 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -2201,6 +2201,7 @@ const schema = gql` folder: String description: String position: Int + category: String } union SaveFilterResult = SaveFilterSuccess | SaveFilterError @@ -2220,6 +2221,7 @@ const schema = gql` updatedAt: Date defaultFilter: Boolean visible: Boolean + category: String } type SaveFilterError { @@ -2271,6 +2273,7 @@ const schema = gql` folder: String description: String visible: Boolean + category: String } enum UpdateFilterErrorCode { diff --git a/packages/web/lib/networking/fragments/savedSearchFragment.ts b/packages/web/lib/networking/fragments/savedSearchFragment.ts index 70bd3b4fd..8efd47d77 100644 --- a/packages/web/lib/networking/fragments/savedSearchFragment.ts +++ b/packages/web/lib/networking/fragments/savedSearchFragment.ts @@ -7,6 +7,8 @@ export type SavedSearch = { position: number visible: boolean defaultFilter: boolean + folder: string + category: string } export const savedSearchFragment = gql` @@ -17,5 +19,7 @@ export const savedSearchFragment = gql` position visible defaultFilter + folder + category } ` diff --git a/packages/web/lib/networking/mutations/saveFilterMutation.ts b/packages/web/lib/networking/mutations/saveFilterMutation.ts index 1bdef13bc..6c6becac5 100644 --- a/packages/web/lib/networking/mutations/saveFilterMutation.ts +++ b/packages/web/lib/networking/mutations/saveFilterMutation.ts @@ -7,6 +7,7 @@ export type AddFilterInput = { filter: string category: string position: number + folder?: string } type AddFilterOutput = { @@ -27,6 +28,8 @@ export async function saveFilterMutation ( position visible defaultFilter + folder + category } } diff --git a/packages/web/lib/networking/mutations/updateFilterMutation.ts b/packages/web/lib/networking/mutations/updateFilterMutation.ts index 8ae562362..62885cd65 100644 --- a/packages/web/lib/networking/mutations/updateFilterMutation.ts +++ b/packages/web/lib/networking/mutations/updateFilterMutation.ts @@ -10,6 +10,7 @@ export type UpdateFilterInput = { category?: string description?: string visible?: boolean + folder?: string } type UpdateFilterOutput = { From 0d60ece6d699102cf8042d8a8bf63764d0811e59 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 8 Dec 2023 20:03:36 +0800 Subject: [PATCH 5/5] make folder optional --- packages/api/src/generated/graphql.ts | 4 ++-- packages/api/src/generated/schema.graphql | 2 +- packages/api/src/resolvers/filters/index.ts | 2 +- packages/api/src/schema.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index e5c815027..61fab2be5 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -820,7 +820,7 @@ export type Filter = { defaultFilter?: Maybe; description?: Maybe; filter: Scalars['String']; - folder: Scalars['String']; + folder?: Maybe; id: Scalars['ID']; name: Scalars['String']; position: Scalars['Int']; @@ -4975,7 +4975,7 @@ export type FilterResolvers, ParentType, ContextType>; description?: Resolver, ParentType, ContextType>; filter?: Resolver; - folder?: Resolver; + folder?: Resolver, ParentType, ContextType>; id?: Resolver; name?: Resolver; position?: Resolver; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 816abbd5a..62e177259 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -727,7 +727,7 @@ type Filter { defaultFilter: Boolean description: String filter: String! - folder: String! + folder: String id: ID! name: String! position: Int! diff --git a/packages/api/src/resolvers/filters/index.ts b/packages/api/src/resolvers/filters/index.ts index 8a8187715..f1c743afd 100644 --- a/packages/api/src/resolvers/filters/index.ts +++ b/packages/api/src/resolvers/filters/index.ts @@ -37,7 +37,7 @@ export const saveFilterResolver = authorized< return t.getRepository(Filter).save({ user: { id: uid }, name: input.name, - folder: input.folder ?? undefined, + folder: input.folder ?? 'inbox', description: '', position: input.position ?? 0, filter: input.filter, diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index b84976126..0b4e16ae6 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -2215,7 +2215,7 @@ const schema = gql` name: String! filter: String! position: Int! - folder: String! + folder: String description: String createdAt: Date! updatedAt: Date