Skip to content
Draft
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
41 changes: 35 additions & 6 deletions packages/features/ee/workflows/api/scheduleSMSReminders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,19 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
//delete all scheduled sms reminders where scheduled date is past current date
await prisma.workflowReminder.deleteMany({
where: {
method: WorkflowMethods.SMS,
scheduledDate: {
lte: dayjs().toISOString(),
},
OR: [
{
method: WorkflowMethods.SMS,
scheduledDate: {
lte: dayjs().toISOString(),
},
},
{
retryCount: {
gt: 1,
},
},
],
},
});
Comment on lines 29 to 45

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Overly broad deletion condition risks unintended data loss.

The OR logic at Line 31 will delete any WorkflowReminder with retryCount > 1, regardless of method (SMS, EMAIL, WHATSAPP) or scheduled date. This can delete non-SMS reminders or reminders that are still pending processing.

The intent appears to be: delete SMS reminders that are either past their scheduled date OR have exceeded retry limits. The second condition should be scoped to SMS reminders.

🔧 Proposed fix
  await prisma.workflowReminder.deleteMany({
    where: {
-     OR: [
-       {
-         method: WorkflowMethods.SMS,
-         scheduledDate: {
-           lte: dayjs().toISOString(),
-         },
-       },
-       {
-         retryCount: {
-           gt: 1,
-         },
-       },
-     ],
+     method: WorkflowMethods.SMS,
+     OR: [
+       {
+         scheduledDate: {
+           lte: dayjs().toISOString(),
+         },
+       },
+       {
+         retryCount: {
+           gt: 1,
+         },
+       },
+     ],
    },
  });
🤖 Prompt for AI Agents
In @packages/features/ee/workflows/api/scheduleSMSReminders.ts around lines 29 -
45, The deletion predicate is too broad: prisma.workflowReminder.deleteMany
currently uses OR with one clause checking method: WorkflowMethods.SMS and
scheduledDate lte, and another clause checking retryCount gt 1 which matches
reminders of any method; narrow the second clause to only apply to SMS reminders
by making both OR branches include method: WorkflowMethods.SMS (i.e., change the
OR array to [{ method: WorkflowMethods.SMS, scheduledDate: { lte: ... } }, {
method: WorkflowMethods.SMS, retryCount: { gt: 1 } }]) so only SMS reminders are
deleted for either being past scheduledDate or exceeding retryCount.


Expand All @@ -44,8 +53,11 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
lte: dayjs().add(7, "day").toISOString(),
},
},
select,
})) as PartialWorkflowReminder[];
select: {
...select,
retryCount: true,
},
})) as (PartialWorkflowReminder & { retryCount: number })[];

if (!unscheduledReminders.length) {
res.json({ ok: true });
Expand Down Expand Up @@ -163,9 +175,26 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
referenceId: scheduledSMS.sid,
},
});
} else {
await prisma.workflowReminder.update({
where: {
id: reminder.id,
},
data: {
retryCount: reminder.retryCount + 1,
},
});
}
}
} catch (error) {
await prisma.workflowReminder.update({
where: {
id: reminder.id,
},
data: {
retryCount: reminder.retryCount + 1,
},
});
console.log(`Error scheduling SMS with error ${error}`);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "WorkflowReminder" ADD COLUMN "retryCount" INTEGER NOT NULL DEFAULT 0;
1 change: 1 addition & 0 deletions packages/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -997,6 +997,7 @@ model WorkflowReminder {
cancelled Boolean?
seatReferenceId String?
isMandatoryReminder Boolean? @default(false)
retryCount Int @default(0)

@@index([bookingUid])
@@index([workflowStepId])
Expand Down