diff --git a/packages/api/src/elastic/index.ts b/packages/api/src/elastic/index.ts index 95ea0a709..65a645bc5 100644 --- a/packages/api/src/elastic/index.ts +++ b/packages/api/src/elastic/index.ts @@ -3,7 +3,13 @@ /* eslint-disable @typescript-eslint/no-unsafe-call */ import { env } from '../env' import { Client } from '@elastic/elasticsearch' -import { PageType, SortBy, SortOrder, SortParams } from '../generated/graphql' +import { + Label, + PageType, + SortBy, + SortOrder, + SortParams, +} from '../generated/graphql' import { InFilter, LabelFilter, @@ -19,7 +25,6 @@ import { } from './types' import { readFileSync } from 'fs' import { join } from 'path' -import { Label } from '../entity/label' const INDEX_NAME = 'pages' const INDEX_ALIAS = 'pages_alias' @@ -220,16 +225,16 @@ export const addLabelInPage = async ( id, body: { script: { - source: - 'if (!ctx._source.labels.contains(params.label)) { ctx._source.labels.add(label) }', + source: `if (ctx._source.labels == null) { + ctx._source.labels = [params.label] + } else if (!ctx._source.labels.any(label -> label.name == params.label.name)) { + ctx._source.labels.add(params.label) + } else { ctx.op = 'none' }`, lang: 'painless', params: { label: label, }, }, - doc: { - updatedAt: new Date(), - }, }, refresh: ctx.refresh, }) diff --git a/packages/api/test/elastic/index.test.ts b/packages/api/test/elastic/index.test.ts index a71a25193..22ac48787 100644 --- a/packages/api/test/elastic/index.test.ts +++ b/packages/api/test/elastic/index.test.ts @@ -1,5 +1,6 @@ import 'mocha' import { + addLabelInPage, createPage, deletePage, getPageById, @@ -145,4 +146,36 @@ describe('elastic api', () => { expect(searchResults).not.undefined }) }) + + describe('addLabelInPage', () => { + context('when the label not exist in the page', () => { + it('adds the label to the page', async () => { + const newLabel = { + id: 'new label id', + name: 'new label', + color: '#07D2D1', + } + + const result = await addLabelInPage(page.id, newLabel, ctx) + expect(result).to.be.true + + const updatedPage = await getPageById(page.id) + expect(updatedPage?.labels).to.deep.include(newLabel) + }) + }) + + context('when the label exists in the page', () => { + it('does not add the label to the page', async () => { + const newLabel = { + id: 'Test label id', + name: 'test label', + color: '#07D2D1', + } + + const result = await addLabelInPage(page.id, newLabel, ctx) + + expect(result).to.be.false + }) + }) + }) }) diff --git a/packages/api/test/services/save_newsletter_email.test.ts b/packages/api/test/services/save_newsletter_email.test.ts index c1bb7b287..cbd070f26 100644 --- a/packages/api/test/services/save_newsletter_email.test.ts +++ b/packages/api/test/services/save_newsletter_email.test.ts @@ -5,17 +5,25 @@ import { createTestUser, deleteTestUser } from '../db' import { createNewsletterEmail } from '../../src/services/newsletters' import { saveNewsletterEmail } from '../../src/services/save_newsletter_email' import { getPageByParam } from '../../src/elastic' +import { User } from '../../src/entity/user' +import { NewsletterEmail } from '../../src/entity/newsletter_email' describe('saveNewsletterEmail', () => { const username = 'fakeUser' + + let user: User + let email: NewsletterEmail + + before(async () => { + user = await createTestUser(username) + email = await createNewsletterEmail(user.id) + }) + after(async () => { await deleteTestUser(username) }) it('adds the newsletter to the library', async () => { - const user = await createTestUser(username) - const email = await createNewsletterEmail(user.id) - await saveNewsletterEmail({ email: email.address, content: 'fake content', @@ -35,4 +43,24 @@ describe('saveNewsletterEmail', () => { expect(page.content).to.contain('fake content') }) }) + + it('should adds a Newsletter label to that page', async () => { + const newLabel = { + name: 'Newsletter', + color: '#07D2D1', + } + + await saveNewsletterEmail({ + email: email.address, + content: 'fake content 2', + url: 'https://example.com/2', + title: 'fake title', + author: 'fake author', + }) + + setTimeout(async () => { + const page = await getPageByParam({ userId: user.id }) + expect(page?.labels).to.deep.include(newLabel) + }) + }) })