From 07cee98ff9a36558e78ac34c349a2ff8b553eb84 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 21 Mar 2024 17:24:24 +0800 Subject: [PATCH] allow label and highlight events to trigger rules --- packages/api/src/entity/rule.ts | 3 +++ packages/api/src/jobs/trigger_rule.ts | 12 +++++++++++- packages/api/src/pubsub.ts | 14 ++++++-------- packages/api/src/services/highlights.ts | 13 +++++++------ packages/api/src/services/labels.ts | 10 +++++----- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/packages/api/src/entity/rule.ts b/packages/api/src/entity/rule.ts index 51c63b972..18538971c 100644 --- a/packages/api/src/entity/rule.ts +++ b/packages/api/src/entity/rule.ts @@ -15,11 +15,14 @@ export enum RuleActionType { Delete = 'DELETE', MarkAsRead = 'MARK_AS_READ', SendNotification = 'SEND_NOTIFICATION', + Webhook = 'WEBHOOK', } export enum RuleEventType { PageCreated = 'PAGE_CREATED', PageUpdated = 'PAGE_UPDATED', + LabelCreated = 'PAGE_CREATED', + HighlightCreated = 'HIGHLIGHT_CREATED', } export interface RuleAction { diff --git a/packages/api/src/jobs/trigger_rule.ts b/packages/api/src/jobs/trigger_rule.ts index 596760295..3a72dac11 100644 --- a/packages/api/src/jobs/trigger_rule.ts +++ b/packages/api/src/jobs/trigger_rule.ts @@ -86,7 +86,9 @@ const sendNotification = async (obj: RuleActionObj) => { return sendPushNotifications(obj.userId, message, 'rule', data) } -const getRuleAction = (actionType: RuleActionType): RuleActionFunc => { +const getRuleAction = ( + actionType: RuleActionType +): RuleActionFunc | undefined => { switch (actionType) { case RuleActionType.AddLabel: return addLabels @@ -98,6 +100,9 @@ const getRuleAction = (actionType: RuleActionType): RuleActionFunc => { return markPageAsRead case RuleActionType.SendNotification: return sendNotification + default: + logger.error('Unknown rule action type', actionType) + return undefined } } @@ -150,6 +155,11 @@ const triggerActions = async ( for (const action of rule.actions) { const actionFunc = getRuleAction(action.type) + if (!actionFunc) { + logger.error('No action function found for action', action.type) + continue + } + const actionObj: RuleActionObj = { libraryItemId, userId, diff --git a/packages/api/src/pubsub.ts b/packages/api/src/pubsub.ts index 4401cfad9..d8c6bba4d 100644 --- a/packages/api/src/pubsub.ts +++ b/packages/api/src/pubsub.ts @@ -53,14 +53,12 @@ export const createPubSubClient = (): PubsubClient => { libraryItemId: string ): Promise => { // queue trigger rule job - if (type === EntityType.PAGE) { - await enqueueTriggerRuleJob({ - userId, - ruleEventType: RuleEventType.PageCreated, - libraryItemId, - data, - }) - } + await enqueueTriggerRuleJob({ + userId, + ruleEventType: `${type.toUpperCase()}_CREATED` as RuleEventType, + libraryItemId, + data, + }) // queue export item job await enqueueExportItem({ userId, diff --git a/packages/api/src/services/highlights.ts b/packages/api/src/services/highlights.ts index babf4d4a4..91249626b 100644 --- a/packages/api/src/services/highlights.ts +++ b/packages/api/src/services/highlights.ts @@ -9,6 +9,7 @@ import { createPubSubClient, EntityType } from '../pubsub' import { authTrx } from '../repository' import { highlightRepository } from '../repository/highlight' import { enqueueUpdateHighlight } from '../utils/createTask' +import { UpdateItemEvent } from './library_item' type HighlightEvent = { id: string; pageId: string } type CreateHighlightEvent = DeepPartial & HighlightEvent @@ -56,9 +57,9 @@ export const createHighlight = async ( userId ) - await pubsub.entityCreated( + await pubsub.entityCreated( EntityType.HIGHLIGHT, - { ...newHighlight, pageId: libraryItemId }, + { id: libraryItemId, highlights: [newHighlight] }, userId, libraryItemId ) @@ -104,9 +105,9 @@ export const mergeHighlights = async ( }) }) - await pubsub.entityCreated( + await pubsub.entityCreated( EntityType.HIGHLIGHT, - { ...newHighlight, pageId: libraryItemId }, + { id: libraryItemId, highlights: [newHighlight] }, userId, libraryItemId ) @@ -139,9 +140,9 @@ export const updateHighlight = async ( }) const libraryItemId = updatedHighlight.libraryItem.id - await pubsub.entityUpdated( + await pubsub.entityUpdated( EntityType.HIGHLIGHT, - { ...highlight, id: highlightId, pageId: libraryItemId }, + { id: libraryItemId, highlights: [highlight] }, userId, libraryItemId ) diff --git a/packages/api/src/services/labels.ts b/packages/api/src/services/labels.ts index f4bae13b7..ca0e02d64 100644 --- a/packages/api/src/services/labels.ts +++ b/packages/api/src/services/labels.ts @@ -8,7 +8,7 @@ import { CreateLabelInput, labelRepository } from '../repository/label' import { bulkEnqueueUpdateLabels } from '../utils/createTask' import { logger } from '../utils/logger' import { findHighlightById } from './highlights' -import { findLibraryItemIdsByLabelId } from './library_item' +import { findLibraryItemIdsByLabelId, UpdateItemEvent } from './library_item' type AddLabelsToLibraryItemEvent = { pageId: string @@ -144,9 +144,9 @@ export const saveLabelsInLibraryItem = async ( if (source === 'user') { // create pubsub event - await pubsub.entityCreated( + await pubsub.entityCreated( EntityType.LABEL, - { pageId: libraryItemId, labels, source }, + { id: libraryItemId, labels }, userId, libraryItemId ) @@ -215,9 +215,9 @@ export const saveLabelsInHighlight = async ( const libraryItemId = highlight.libraryItemId // create pubsub event - await pubsub.entityCreated( + await pubsub.entityCreated( EntityType.LABEL, - { highlightId, labels }, + { id: libraryItemId, highlights: [{ id: highlightId, labels }] }, userId, libraryItemId )