feat: add create or update workflow trigger (#14708)
### Description This PR focuses on https://github.com/twentyhq/core-team-issues/issues/1476 - introduces the handling of upserted events in the workflow trigger system ## Visual Appearance <img width="1792" height="1039" alt="Screenshot 2025-09-21 at 11 40 28 PM" src="https://github.com/user-attachments/assets/d926b566-f7d3-412b-b1ab-ed2064425f3d" /> <img width="501" height="1025" alt="Screenshot 2025-09-21 at 11 40 39 PM" src="https://github.com/user-attachments/assets/13c3031a-0762-4c80-8df1-fa74ca70a540" /> ### Changes - Added `UPSERTED` action to the `DatabaseEventAction` enum. - Updated the `WorkflowEditTriggerDatabaseEventForm` to support upserted events. --------- Co-authored-by: Thomas Trompette <thomas.trompette@sfr.fr>
This commit is contained in:
+6
-1
@@ -4,12 +4,17 @@ export type BaseDatabaseEventTriggerSettings = {
|
||||
|
||||
export type DatabaseEventTriggerSettings =
|
||||
| BaseDatabaseEventTriggerSettings
|
||||
| UpdateEventTriggerSettings;
|
||||
| UpdateEventTriggerSettings
|
||||
| UpsertEventTriggerSettings;
|
||||
|
||||
export type UpdateEventTriggerSettings = BaseDatabaseEventTriggerSettings & {
|
||||
fields: string[];
|
||||
};
|
||||
|
||||
export type UpsertEventTriggerSettings = BaseDatabaseEventTriggerSettings & {
|
||||
fields: string[];
|
||||
};
|
||||
|
||||
export type CronTriggerSettings = {
|
||||
pattern: string;
|
||||
};
|
||||
|
||||
+34
-1
@@ -12,6 +12,7 @@ import { type ObjectRecordDeleteEvent } from 'src/engine/core-modules/event-emit
|
||||
import { type ObjectRecordDestroyEvent } from 'src/engine/core-modules/event-emitter/types/object-record-destroy.event';
|
||||
import { type ObjectRecordNonDestructiveEvent } from 'src/engine/core-modules/event-emitter/types/object-record-non-destructive-event';
|
||||
import { type ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event';
|
||||
import { type ObjectRecordUpsertEvent } from 'src/engine/core-modules/event-emitter/types/object-record-upsert.event';
|
||||
import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator';
|
||||
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
|
||||
import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
|
||||
@@ -22,7 +23,10 @@ import {
|
||||
type WorkflowAutomatedTriggerWorkspaceEntity,
|
||||
} from 'src/modules/workflow/common/standard-objects/workflow-automated-trigger.workspace-entity';
|
||||
import { WorkflowCommonWorkspaceService } from 'src/modules/workflow/common/workspace-services/workflow-common.workspace-service';
|
||||
import { type UpdateEventTriggerSettings } from 'src/modules/workflow/workflow-trigger/automated-trigger/constants/automated-trigger-settings';
|
||||
import {
|
||||
type UpdateEventTriggerSettings,
|
||||
type UpsertEventTriggerSettings,
|
||||
} from 'src/modules/workflow/workflow-trigger/automated-trigger/constants/automated-trigger-settings';
|
||||
import {
|
||||
WorkflowTriggerJob,
|
||||
type WorkflowTriggerJobData,
|
||||
@@ -110,6 +114,22 @@ export class WorkflowDatabaseEventTriggerListener {
|
||||
});
|
||||
}
|
||||
|
||||
@OnDatabaseBatchEvent('*', DatabaseEventAction.UPSERTED)
|
||||
async handleObjectRecordUpsertEvent(
|
||||
payload: WorkspaceEventBatch<ObjectRecordUpsertEvent>,
|
||||
) {
|
||||
if (await this.shouldIgnoreEvent(payload)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const clonedPayload = structuredClone(payload);
|
||||
|
||||
await this.handleEvent({
|
||||
payload: clonedPayload,
|
||||
action: DatabaseEventAction.UPSERTED,
|
||||
});
|
||||
}
|
||||
|
||||
private async enrichCreatedEvent(
|
||||
payload: WorkspaceEventBatch<ObjectRecordCreateEvent>,
|
||||
) {
|
||||
@@ -316,6 +336,19 @@ export class WorkflowDatabaseEventTriggerListener {
|
||||
);
|
||||
}
|
||||
|
||||
if (action === DatabaseEventAction.UPSERTED) {
|
||||
const settings = eventListener.settings as UpsertEventTriggerSettings;
|
||||
const upsertEventPayload = eventPayload as ObjectRecordUpsertEvent;
|
||||
|
||||
return (
|
||||
!settings.fields ||
|
||||
settings.fields.length === 0 ||
|
||||
settings.fields.some((field) =>
|
||||
upsertEventPayload?.properties?.updatedFields?.includes(field),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user