From 6cae3dc9b534202bfdce8f57cb972444968707b8 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 28 Jun 2022 09:53:48 +0800 Subject: [PATCH 1/5] Add highlights in search item --- packages/api/src/generated/graphql.ts | 2 ++ packages/api/src/generated/schema.graphql | 1 + packages/api/src/schema.ts | 1 + 3 files changed, 4 insertions(+) diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index ce6ac7269..c6ef314ee 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1512,6 +1512,7 @@ export type SearchItem = { contentReader: ContentReader; createdAt: Scalars['Date']; description?: Maybe; + highlights?: Maybe>; id: Scalars['ID']; image?: Maybe; isArchived: Scalars['Boolean']; @@ -3841,6 +3842,7 @@ export type SearchItemResolvers; createdAt?: Resolver; description?: Resolver, ParentType, ContextType>; + highlights?: Resolver>, ParentType, ContextType>; id?: Resolver; image?: Resolver, ParentType, ContextType>; isArchived?: Resolver; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index c219fb5c0..38349889d 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -1070,6 +1070,7 @@ type SearchItem { contentReader: ContentReader! createdAt: Date! description: String + highlights: [Highlight!] id: ID! image: String isArchived: Boolean! diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 8f77763e3..fb8766940 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -1499,6 +1499,7 @@ const schema = gql` language: String readAt: Date savedAt: Date! + highlights: [Highlight!] } type SearchItemEdge { From bf1faaeea42664ddd3b8c46fb00b3247a57e2f75 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 28 Jun 2022 09:56:39 +0800 Subject: [PATCH 2/5] Include highlights in search page result in elastic --- packages/api/src/elastic/pages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/src/elastic/pages.ts b/packages/api/src/elastic/pages.ts index c83b92e74..64e86d63c 100644 --- a/packages/api/src/elastic/pages.ts +++ b/packages/api/src/elastic/pages.ts @@ -403,7 +403,7 @@ export const searchPages = async ( from, size, _source: { - excludes: ['originalHtml', 'content', 'highlights'], + excludes: ['originalHtml', 'content'], }, } From 59efc5fea7982c615d0fa1d16f9e9e277dc07d1f Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 28 Jun 2022 10:14:15 +0800 Subject: [PATCH 3/5] Add test --- packages/api/src/elastic/types.ts | 2 ++ packages/api/test/resolvers/article.test.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/packages/api/src/elastic/types.ts b/packages/api/src/elastic/types.ts index 3a89c8da5..99dc06890 100644 --- a/packages/api/src/elastic/types.ts +++ b/packages/api/src/elastic/types.ts @@ -232,6 +232,8 @@ export interface SearchItem { readAt?: Date savedAt: Date updatedAt?: Date + labels?: Label[] + highlights?: Highlight[] } const keys = ['_id', 'url', 'slug', 'userId', 'uploadFileId', 'state'] as const diff --git a/packages/api/test/resolvers/article.test.ts b/packages/api/test/resolvers/article.test.ts index ef82378f3..8353b68ca 100644 --- a/packages/api/test/resolvers/article.test.ts +++ b/packages/api/test/resolvers/article.test.ts @@ -180,6 +180,9 @@ const searchQuery = (keyword = '') => { url createdAt updatedAt + highlights { + id + } } } pageInfo { @@ -1021,6 +1024,15 @@ describe('Article API', () => { expect(res.body.data.search.edges[3].node.id).to.eq(pages[1].id) expect(res.body.data.search.edges[4].node.id).to.eq(pages[0].id) }) + + it('should return highlights in pages', async () => { + const res = await graphqlRequest(query, authToken).expect(200) + + expect(res.body.data.search.edges[0].node.highlights.length).to.eql(1) + expect(res.body.data.search.edges[0].node.highlights[0].id).to.eq( + highlights[4].id + ) + }) }) context('when type:highlights is in the query', () => { From 00f38d113467cd58c18089179b1a341a3d005d06 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 28 Jun 2022 11:55:26 +0800 Subject: [PATCH 4/5] Update page updatedAt when updating highlights --- packages/api/src/elastic/highlights.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/api/src/elastic/highlights.ts b/packages/api/src/elastic/highlights.ts index 7bb5803ce..5fb5e568d 100644 --- a/packages/api/src/elastic/highlights.ts +++ b/packages/api/src/elastic/highlights.ts @@ -25,7 +25,8 @@ export const addHighlightToPage = async ( ctx._source.highlights = [params.highlight] } else { ctx._source.highlights.add(params.highlight) - }`, + } + ctx._source.updatedAt = params.highlight.updatedAt`, lang: 'painless', params: { highlight: highlight, @@ -102,11 +103,12 @@ export const deleteHighlight = async ( index: INDEX_ALIAS, body: { script: { - source: - 'ctx._source.highlights.removeIf(h -> h.id == params.highlightId)', + source: `ctx._source.highlights.removeIf(h -> h.id == params.highlightId); + ctx._source.updatedAt = params.updatedAt`, lang: 'painless', params: { highlightId: highlightId, + updatedAt: new Date(), }, }, query: { @@ -257,7 +259,8 @@ export const updateHighlight = async ( body: { script: { source: `ctx._source.highlights.removeIf(h -> h.id == params.highlight.id); - ctx._source.highlights.add(params.highlight)`, + ctx._source.highlights.add(params.highlight); + ctx._source.updatedAt = params.highlight.updatedAt`, lang: 'painless', params: { highlight: highlight, From c08afe6451f8d39aacb09e01685c98b008a6a91a Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 28 Jun 2022 12:03:37 +0800 Subject: [PATCH 5/5] Update page updatedAt when updating labels --- packages/api/src/elastic/labels.ts | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/api/src/elastic/labels.ts b/packages/api/src/elastic/labels.ts index 25f479704..ce02655e2 100644 --- a/packages/api/src/elastic/labels.ts +++ b/packages/api/src/elastic/labels.ts @@ -15,13 +15,16 @@ export const addLabelInPage = async ( body: { script: { source: `if (ctx._source.labels == null) { - ctx._source.labels = [params.label] + ctx._source.labels = [params.label]; + ctx._source.updatedAt = params.updatedAt } else if (!ctx._source.labels.any(label -> label.name == params.label.name)) { - ctx._source.labels.add(params.label) + ctx._source.labels.add(params.label) ; + ctx._source.updatedAt = params.updatedAt } else { ctx.op = 'none' }`, lang: 'painless', params: { label: label, + updatedAt: new Date(), }, }, }, @@ -99,20 +102,22 @@ export const deleteLabel = async ( ctx: PageContext ): Promise => { try { - console.log('deleting label', label) const { body } = await client.updateByQuery({ index: INDEX_ALIAS, body: { script: { source: `if (ctx._source.highlights != null && ctx._source.highlights[0].labels != null) { - ctx._source.highlights[0].labels.removeIf(label -> label.name == params.label) + ctx._source.highlights[0].labels.removeIf(label -> label.name == params.label); + ctx._source.updatedAt = params.updatedAt } if (ctx._source.labels != null) { - ctx._source.labels.removeIf(label -> label.name == params.label) + ctx._source.labels.removeIf(label -> label.name == params.label); + ctx._source.updatedAt = params.updatedAt }`, lang: 'painless', params: { label: label, + updatedAt: new Date(), }, }, query: { @@ -178,15 +183,18 @@ export const updateLabel = async ( script: { source: `if (ctx._source.labels != null) { ctx._source.labels.removeIf(l -> l.id == params.label.id); - ctx._source.labels.add(params.label) + ctx._source.labels.add(params.label); + ctx._source.updatedAt = params.updatedAt } if (ctx._source.highlights != null) { ctx._source.highlights[0].labels.removeIf(l -> l.id == params.label.id); - ctx._source.highlights[0].labels.add(params.label) + ctx._source.highlights[0].labels.add(params.label); + ctx._source.updatedAt = params.updatedAt }`, lang: 'painless', params: { label: label, + updatedAt: new Date(), }, }, query: { @@ -252,10 +260,12 @@ export const setLabelsForHighlight = async ( index: INDEX_ALIAS, body: { script: { - source: `ctx._source.highlights[0].labels = params.labels`, + source: `ctx._source.highlights[0].labels = params.labels; + ctx._source.updatedAt = params.updatedAt`, lang: 'painless', params: { labels: labels, + updatedAt: new Date(), }, }, query: {