feat: workflow delay action (Pause - Wait/Sleep/Delay) (#14915)

## Description

- This PR focuses on issue
https://github.com/orgs/twentyhq/projects/1/views/33?pane=issue&itemId=93150683&issue=twentyhq%7Ccore-team-issues%7C20
- added Workflow delay as a Flow action
- for V1 added Type 1: Resume at a specific date or time


## Visual Appearance
<img width="1792" height="1038" alt="Screenshot 2025-10-09 at 5 46
18 PM"
src="https://github.com/user-attachments/assets/e62980e9-59c7-4e5a-b8ec-1e848a462d3f"
/>

<img width="1792" height="1037" alt="Screenshot 2025-10-09 at 5 46
35 PM"
src="https://github.com/user-attachments/assets/7c3f4e39-ab0a-40ed-97a8-4f0cdb86f295"
/>

---------

Co-authored-by: Thomas Trompette <thomas.trompette@sfr.fr>
This commit is contained in:
Harshit Singh
2025-10-20 15:15:55 +02:00
committed by GitHub
co-authored by Thomas Trompette
parent 11564f135e
commit 4e5783eaf4
33 changed files with 643 additions and 12 deletions
@@ -20,6 +20,7 @@ import { type MessageQueueWorkerOptions } from 'src/engine/core-modules/message-
import { type MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
import { getJobKey } from 'src/engine/core-modules/message-queue/utils/get-job-key.util';
import { MESSAGE_QUEUE_PRIORITY } from 'src/engine/core-modules/message-queue/message-queue-priority.constant';
export type BullMQDriverOptions = QueueOptions;
@@ -167,10 +168,11 @@ export class BullMQDriver implements MessageQueueDriver, OnModuleDestroy {
const queueOptions: JobsOptions = {
jobId: options?.id ? `${options.id}-${v4()}` : undefined, // We add V4() to id to make sure ids are uniques so we can add a waiting job when a job related with the same option.id is running
priority: options?.priority,
priority: options?.priority ?? MESSAGE_QUEUE_PRIORITY[queueName],
attempts: 1 + (options?.retryLimit || 0),
removeOnComplete: true,
removeOnFail: 100,
delay: options?.delay,
};
await this.queueMap[queueName].add(jobName, data, queueOptions);
@@ -2,6 +2,7 @@ export interface QueueJobOptions {
id?: string;
priority?: number;
retryLimit?: number;
delay?: number;
}
export interface QueueCronJobOptions extends QueueJobOptions {
@@ -0,0 +1,19 @@
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
export const MESSAGE_QUEUE_PRIORITY = {
[MessageQueue.billingQueue]: 1,
[MessageQueue.entityEventsToDbQueue]: 1,
[MessageQueue.emailQueue]: 1,
[MessageQueue.workflowQueue]: 2,
[MessageQueue.webhookQueue]: 2,
[MessageQueue.messagingQueue]: 2,
[MessageQueue.delayedJobsQueue]: 3,
[MessageQueue.calendarQueue]: 4,
[MessageQueue.contactCreationQueue]: 4,
[MessageQueue.taskAssignedQueue]: 4,
[MessageQueue.serverlessFunctionQueue]: 4,
[MessageQueue.workspaceQueue]: 5,
[MessageQueue.triggerQueue]: 5,
[MessageQueue.deleteCascadeQueue]: 6,
[MessageQueue.cronQueue]: 7,
};
@@ -14,6 +14,7 @@ export enum MessageQueue {
workspaceQueue = 'workspace-queue',
entityEventsToDbQueue = 'entity-events-to-db-queue',
workflowQueue = 'workflow-queue',
delayedJobsQueue = 'delayed-jobs-queue',
deleteCascadeQueue = 'delete-cascade-queue',
serverlessFunctionQueue = 'serverless-function-queue',
triggerQueue = 'trigger-queue',