From ff654802ba8566b271c735830ec1093457e79dce Mon Sep 17 00:00:00 2001 From: Joan Reyero Date: Thu, 25 Aug 2022 16:56:00 +0200 Subject: [PATCH] Hotfix/eagle eye events (#6) --- .../eagleEyeContent/eagleEyeContentList.ts | 4 ++- .../eagleEyeContent/eagleEyeContentSearch.ts | 2 +- .../eagleEyeContentRepository.test.ts | 16 +++++++++ .../repositories/eagleEyeContentRepository.ts | 8 +++++ .../src/services/eagleEyeContentService.ts | 33 +++++++++++++++++++ 5 files changed, 61 insertions(+), 2 deletions(-) diff --git a/backend/src/api/eagleEyeContent/eagleEyeContentList.ts b/backend/src/api/eagleEyeContent/eagleEyeContentList.ts index 8cef87d944..613e58a82c 100644 --- a/backend/src/api/eagleEyeContent/eagleEyeContentList.ts +++ b/backend/src/api/eagleEyeContent/eagleEyeContentList.ts @@ -10,7 +10,9 @@ export default async (req, res) => { const payload = await new EagleEyeContentService(req).findAndCountAll(req.query) if (req.query.filter && Object.keys(req.query.filter).length > 0) { - track('Eagle Eye Content Filtered', { filter: req.query.filter }, { ...req }) + const platforms = req.query.filter.platforms ? req.query.filter.platforms.split(',') : [] + const nDays = req.query.filter.nDays + track('Eagle Eye Filter', { filter: req.query.filter, platforms, nDays }, { ...req }) } await ApiResponseHandler.success(req, res, payload) diff --git a/backend/src/api/eagleEyeContent/eagleEyeContentSearch.ts b/backend/src/api/eagleEyeContent/eagleEyeContentSearch.ts index 08b244969a..6c38288a90 100644 --- a/backend/src/api/eagleEyeContent/eagleEyeContentSearch.ts +++ b/backend/src/api/eagleEyeContent/eagleEyeContentSearch.ts @@ -12,7 +12,7 @@ export default async (req, res) => { const payload = await new EagleEyeContentService(req).search(req.body.data) - track('EagleEyeContent Manually Created', { ...req.body.data }, { ...req }) + track('EagleEyeSearch', { ...req.body.data }, { ...req }) await ApiResponseHandler.success(req, res, payload) } catch (error) { diff --git a/backend/src/database/repositories/__tests__/eagleEyeContentRepository.test.ts b/backend/src/database/repositories/__tests__/eagleEyeContentRepository.test.ts index 4648e92496..3933dce84b 100644 --- a/backend/src/database/repositories/__tests__/eagleEyeContentRepository.test.ts +++ b/backend/src/database/repositories/__tests__/eagleEyeContentRepository.test.ts @@ -329,6 +329,22 @@ describe('eagleEyeContentRepository tests', () => { expect(found.count).toBe(3) }) + it('Filter by nDays', async () => { + const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) + + await addAll(mockIRepositoryOptions) + + const found = await EagleEyeContentRepository.findAndCountAll( + { + filter: { + nDays: 1, + }, + }, + mockIRepositoryOptions, + ) + expect(found.count).toBe(3) + }) + it('Filter by status NULL', async () => { const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) diff --git a/backend/src/database/repositories/eagleEyeContentRepository.ts b/backend/src/database/repositories/eagleEyeContentRepository.ts index 23d5c96cf9..28e18aa058 100644 --- a/backend/src/database/repositories/eagleEyeContentRepository.ts +++ b/backend/src/database/repositories/eagleEyeContentRepository.ts @@ -184,6 +184,14 @@ export default class EagleEyeContentRepository { }) } + if (filter.nDays) { + whereAnd.push({ + timestamp: { + [Op.gte]: moment().subtract(filter.nDays, 'days').toDate(), + }, + }) + } + if (filter.title) { whereAnd.push(SequelizeFilterUtils.ilikeIncludes('eagleEyeContent', 'title', filter.title)) } diff --git a/backend/src/services/eagleEyeContentService.ts b/backend/src/services/eagleEyeContentService.ts index 004878fc4f..b53164ead9 100644 --- a/backend/src/services/eagleEyeContentService.ts +++ b/backend/src/services/eagleEyeContentService.ts @@ -5,6 +5,7 @@ import { IServiceOptions } from './IServiceOptions' import EagleEyeContentRepository from '../database/repositories/eagleEyeContentRepository' import { getConfig } from '../config' import Error400 from '../errors/Error403' +import track from '../segment/track' interface EagleEyeSearchPoint { vectorId: string @@ -118,11 +119,43 @@ export default class EagleEyeContentService { const transaction = await SequelizeRepository.createTransaction(this.options.database) try { + const recordBeforeUpdate = await EagleEyeContentRepository.findById(id, { ...this.options }) const record = await EagleEyeContentRepository.update(id, data, { ...this.options, transaction, }) + // If we are updating status we want to track it + if (data.status !== recordBeforeUpdate.status) { + // If we are going from null to status, we are either accepting or rejecting + if (data.status && data.status !== null && data.status !== undefined) { + track( + `EagleEye ${data.status}`, + { + ...data, + platform: record.platform, + keywords: record.keywords, + title: record.title, + url: record.url, + }, + { ...this.options }, + ) + // Here we are bringing back a rejected post to the Inbox + } else if (recordBeforeUpdate.status === 'rejected' && data.status === null) { + track( + `EagleEye post from rejected to Inbox`, + { + ...data, + platform: record.platform, + keywords: record.keywords, + title: record.title, + url: record.url, + }, + { ...this.options }, + ) + } + } + await SequelizeRepository.commitTransaction(transaction) return record