Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions backend/src/api/eagleEyeContent/eagleEyeContentReply.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import Permissions from '../../security/permissions'
import track from '../../segment/track'
import EagleEyeContentService from '../../services/eagleEyeContentService'
import PermissionChecker from '../../services/user/permissionChecker'

export default async (req, res) => {
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeActionCreate)

const payload = await EagleEyeContentService.reply(req.query.title, req.query.description)

track(
'Eagle Eye reply generated',
{
title: req.query.title,
description: req.query.description,
reply: payload.reply,
},
{ ...req },
)
await req.responseHandler.success(req, res, payload)
}
94 changes: 86 additions & 8 deletions backend/src/api/eagleEyeContent/eagleEyeContentTrack.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,95 @@
import Permissions from '../../security/permissions'
import PermissionChecker from '../../services/user/permissionChecker'
import track from '../../segment/track'
import Error404 from '../../errors/Error404'

export default async (req, res) => {
new PermissionChecker(req).validateHas(Permissions.values.eagleEyeContentRead)
track(
'Eagle Eye post clicked',
{
url: req.body.url,
platform: req.body.platform,
},
{ ...req },
)

const event = req.body.event
const params = req.body.params

switch (event) {
case 'postClicked':
console.log('Eagle Eye post clicked', {
url: params.url,
platform: params.platform,
})
track(
'Eagle Eye post clicked',
{
url: params.url,
platform: params.platform,
},
{ ...req },
)
break
case 'generatedReply':
console.log('Eagle Eye AI reply generated', {
title: params.title,
description: params.description,
platform: params.platform,
reply: params.reply,
url: params.url,
})
track(
'Eagle Eye AI reply generated',
{
title: params.title,
description: params.description,
platform: params.platform,
reply: params.reply,
url: params.url,
},
{ ...req },
)
break
case 'generatedReplyFeedback':
console.log('Eagle Eye AI reply feedback', {
type: params.type,
title: params.title,
description: params.description,
platform: params.platform,
reply: params.reply,
url: params.url,
})
track(
'Eagle Eye AI reply feedback',
{
type: params.type,
title: params.title,
description: params.description,
platform: params.platform,
reply: params.reply,
url: params.url,
},
{ ...req },
)
break
case 'generatedReplyCopied':
console.log('Eagle Eye AI reply copied', {
title: params.title,
description: params.description,
platform: params.platform,
url: params.url,
reply: params.reply,
})
track(
'Eagle Eye AI reply copied',
{
title: params.title,
description: params.description,
platform: params.platform,
url: params.url,
reply: params.reply,
},
{ ...req },
)
break

default:
throw new Error404('en', 'erros.eagleEye.invlaidEvent')
}

const out = {
Success: true,
Expand Down
6 changes: 6 additions & 0 deletions backend/src/api/eagleEyeContent/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ export default (app) => {
safeWrap(require('./eagleEyeContentTrack').default),
)

app.get(
`/tenant/:tenantId/eagleEyeContent/reply`,
featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'),
safeWrap(require('./eagleEyeContentReply').default),
)

app.get(
`/tenant/:tenantId/eagleEyeContent/search`,
featureFlagMiddleware(FeatureFlag.EAGLE_EYE, 'entities.eagleEye.errors.planLimitExceeded'),
Expand Down
1 change: 1 addition & 0 deletions backend/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ const en = {
'emailDigest.frequency needs to be one of daily, weekly. Settings not updated.',
timeInvalid: 'emailDigest.time needs to be a valid time. Settings not updated.',
notOnboarded: 'Eagle eye is not set up yet.',
invalidEvent: 'Invalid event type.',
},
integrations: {
badEndpoint: 'Bad endpoint: {0}',
Expand Down
20 changes: 20 additions & 0 deletions backend/src/services/eagleEyeContentService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,4 +184,24 @@ export default class EagleEyeContentService extends LoggingBase {

return out
}

static async reply(title, description) {
const config = {
method: 'get',
maxBodyLength: Infinity,
url: `${EAGLE_EYE_CONFIG.url}/reply`,
params: {
title,
description,
},
headers: {
Authorization: `Bearer ${EAGLE_EYE_CONFIG.apiKey}`,
},
}

const response = await axios(config)
return {
reply: response.data,
}
}
}
8 changes: 7 additions & 1 deletion backend/src/services/eagleEyeSettingsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,13 @@ export default class EagleEyeSettingsService extends LoggingBase {
}

// Remove any extra fields
data = lodash.pick(data, ['onboarded', 'feed', 'emailDigestActive', 'emailDigest'])
data = lodash.pick(data, [
'onboarded',
'feed',
'emailDigestActive',
'emailDigest',
'aiReplies',
])

// Update the user's EagleEye settings
const userOut = await UserRepository.updateEagleEyeSettings(
Expand Down
1 change: 1 addition & 0 deletions backend/src/types/eagleEyeTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export interface EagleEyeSettings {
feed: EagleEyeFeedSettings
emailDigestActive: boolean
emailDigest?: EagleEyeEmailDigestSettings
aiReplies: boolean
}

// Enum for EagleEyePlatforms
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
class="bg-gray-200 h-5 w-10/12 last:w-9/12 rounded animate-pulse"
/>
</div>

<div class="mb-10 flex flex-col gap-3">
<div
v-for="(_, index) in Array(tiles.description)"
Expand All @@ -21,22 +20,18 @@
</div>
</div>
</template>

<script setup>
import { computed, defineProps } from 'vue'

const props = defineProps({
size: {
type: String,
default: 'small'
}
})

const tiles = computed(() => {
if (props.size === 'small') {
return { title: 2, description: 3 }
}

return { title: 3, description: 4 }
})
</script>
Loading