Skip to content

Commit 6973231

Browse files
Joan Reyeroepipavjoanagmaiagaspergrom
authored
Eagle Eye 2.0 (#495)
Co-authored-by: anilb <epipav@gmail.com> Co-authored-by: joanagmaia <joanamaiaportugal@gmail.com> Co-authored-by: Gašper Grom <gasper.grom@gmail.com> Co-authored-by: Joana Maia <joana@crowd.dev>
1 parent 5e37cd9 commit 6973231

123 files changed

Lines changed: 6254 additions & 2153 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/lint-frontend.yml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,5 @@ jobs:
1313
uses: actions/checkout@v2
1414

1515
- name: Lint code
16-
uses: reviewdog/action-eslint@v1
17-
with:
18-
reporter: github-pr-review
19-
fail_on_error: true
20-
workdir: 'frontend/'
16+
run: npm i && npm run lint
17+
working-directory: frontend

backend/.env.dist.local

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,8 @@ CROWD_QDRANT_PORT=6333
133133

134134
# Enrichment settings
135135
CROWD_ENRICHMENT_URL=
136-
CROWD_ENRICHMENT_API_KEY=
136+
CROWD_ENRICHMENT_API_KEY=
137+
138+
# EagleEye settings
139+
CROWD_EAGLE_EYE_URL=
140+
CROWD_EAGLE_EYE_API_KEY=

backend/config/custom-environment-variables.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
"templateWeeklyAnalytics": "CROWD_SENDGRID_TEMPLATE_WEEKLY_ANALYTICS",
9595
"templateIntegrationDone": "CROWD_SENDGRID_TEMPLATE_INTEGRATION_DONE",
9696
"templateCsvExport": "CROWD_SENDGRID_TEMPLATE_CSV_EXPORT",
97+
"templateEagleEyeDigest": "CROWD_SENDGRID_TEMPLATE_EAGLE_EYE_DIGEST",
9798
"weeklyAnalyticsUnsubscribeGroupId": "CROWD_SENDGRID_WEEKLY_ANALYTICS_UNSUBSCRIBE_GROUP_ID"
9899
},
99100
"plans": {
@@ -135,5 +136,9 @@
135136
"enrichment": {
136137
"url": "CROWD_ENRICHMENT_URL",
137138
"apiKey": "CROWD_ENRICHMENT_API_KEY"
139+
},
140+
"eagleEye": {
141+
"url": "CROWD_EAGLE_EYE_URL",
142+
"apiKey": "CROWD_EAGLE_EYE_API_KEY"
138143
}
139144
}

backend/config/default.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@
3434
"maxRetrospectInSeconds": 3600
3535
},
3636
"github": {},
37-
"enrichment": {}
37+
"enrichment": {},
38+
"eagleEye": {}
3839
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import Permissions from '../../security/permissions'
2+
import EagleEyeActionService from '../../services/eagleEyeActionService'
3+
import PermissionChecker from '../../services/user/permissionChecker'
4+
5+
export default async (req, res) => {
6+
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeActionCreate)
7+
8+
const payload = await new EagleEyeActionService(req).create(req.body, req.params.contentId)
9+
10+
await req.responseHandler.success(req, res, payload)
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import Permissions from '../../security/permissions'
2+
import EagleEyeActionService from '../../services/eagleEyeActionService'
3+
import PermissionChecker from '../../services/user/permissionChecker'
4+
5+
export default async (req, res) => {
6+
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeActionDestroy)
7+
8+
const payload = await new EagleEyeActionService(req).destroy(req.params.actionId)
9+
10+
await req.responseHandler.success(req, res, payload)
11+
}

backend/src/api/eagleEyeContent/eagleEyeContentList.ts renamed to backend/src/api/eagleEyeContent/eagleEyeContentReply.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@ import EagleEyeContentService from '../../services/eagleEyeContentService'
44
import PermissionChecker from '../../services/user/permissionChecker'
55

66
export default async (req, res) => {
7-
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeContentRead)
8-
const payload = await new EagleEyeContentService(req).findAndCountAll(req.query)
7+
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeActionCreate)
98

10-
if (req.query.filter && Object.keys(req.query.filter).length > 0) {
11-
const platforms = req.query.filter.platforms ? req.query.filter.platforms.split(',') : []
12-
const nDays = req.query.filter.nDays
13-
track('Eagle Eye Filter', { filter: req.query.filter, platforms, nDays }, { ...req })
14-
}
9+
const payload = await EagleEyeContentService.reply(req.query.title, req.query.description)
1510

11+
track(
12+
'Eagle Eye reply generated',
13+
{
14+
title: req.query.title,
15+
description: req.query.description,
16+
reply: payload.reply,
17+
},
18+
{ ...req },
19+
)
1620
await req.responseHandler.success(req, res, payload)
1721
}

backend/src/api/eagleEyeContent/eagleEyeContentSearch.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ import EagleEyeContentService from '../../services/eagleEyeContentService'
44
import PermissionChecker from '../../services/user/permissionChecker'
55

66
export default async (req, res) => {
7-
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeContentSearch)
8-
9-
const payload = await new EagleEyeContentService(req).search(req.body)
10-
11-
track('EagleEyeSearch', { ...req.body }, { ...req })
7+
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeActionCreate)
128

9+
const payload = await new EagleEyeContentService(req).search()
10+
track('EagleEye backend search', { ...req.body }, { ...req })
1311
await req.responseHandler.success(req, res, payload)
1412
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import Permissions from '../../security/permissions'
2+
import PermissionChecker from '../../services/user/permissionChecker'
3+
import track from '../../segment/track'
4+
import Error404 from '../../errors/Error404'
5+
6+
export default async (req, res) => {
7+
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeContentRead)
8+
9+
const event = req.body.event
10+
const params = req.body.params
11+
12+
switch (event) {
13+
case 'postClicked':
14+
console.log('Eagle Eye post clicked', {
15+
url: params.url,
16+
platform: params.platform,
17+
})
18+
track(
19+
'Eagle Eye post clicked',
20+
{
21+
url: params.url,
22+
platform: params.platform,
23+
},
24+
{ ...req },
25+
)
26+
break
27+
case 'generatedReply':
28+
console.log('Eagle Eye AI reply generated', {
29+
title: params.title,
30+
description: params.description,
31+
platform: params.platform,
32+
reply: params.reply,
33+
url: params.url,
34+
})
35+
track(
36+
'Eagle Eye AI reply generated',
37+
{
38+
title: params.title,
39+
description: params.description,
40+
platform: params.platform,
41+
reply: params.reply,
42+
url: params.url,
43+
},
44+
{ ...req },
45+
)
46+
break
47+
case 'generatedReplyFeedback':
48+
console.log('Eagle Eye AI reply feedback', {
49+
type: params.type,
50+
title: params.title,
51+
description: params.description,
52+
platform: params.platform,
53+
reply: params.reply,
54+
url: params.url,
55+
})
56+
track(
57+
'Eagle Eye AI reply feedback',
58+
{
59+
type: params.type,
60+
title: params.title,
61+
description: params.description,
62+
platform: params.platform,
63+
reply: params.reply,
64+
url: params.url,
65+
},
66+
{ ...req },
67+
)
68+
break
69+
case 'generatedReplyCopied':
70+
console.log('Eagle Eye AI reply copied', {
71+
title: params.title,
72+
description: params.description,
73+
platform: params.platform,
74+
url: params.url,
75+
reply: params.reply,
76+
})
77+
track(
78+
'Eagle Eye AI reply copied',
79+
{
80+
title: params.title,
81+
description: params.description,
82+
platform: params.platform,
83+
url: params.url,
84+
reply: params.reply,
85+
},
86+
{ ...req },
87+
)
88+
break
89+
90+
default:
91+
throw new Error404('en', 'erros.eagleEye.invlaidEvent')
92+
}
93+
94+
const out = {
95+
Success: true,
96+
}
97+
98+
await req.responseHandler.success(req, res, out)
99+
}

backend/src/api/eagleEyeContent/eagleEyeContentUpdate.ts renamed to backend/src/api/eagleEyeContent/eagleEyeContentUpsert.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import EagleEyeContentService from '../../services/eagleEyeContentService'
33
import PermissionChecker from '../../services/user/permissionChecker'
44

55
export default async (req, res) => {
6-
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeContentEdit)
6+
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeContentCreate)
77

8-
const payload = await new EagleEyeContentService(req).update(req.params.id, req.body)
8+
const payload = await new EagleEyeContentService(req).upsert(req.body)
99

1010
await req.responseHandler.success(req, res, payload)
1111
}

0 commit comments

Comments
 (0)