From 92deaf1032e30f30fd66329dcd29d0ac71f205a4 Mon Sep 17 00:00:00 2001 From: yiekheng Date: Sat, 9 May 2026 17:52:36 +0800 Subject: [PATCH] fix(scheduler): flip one-off reminders to 'ended' after firing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A fired one-off reminder was staying active forever in the DB and showing 🟢 in the Reminders list. Update reminders.status to 'ended' once a one-off has fired (regardless of run outcome — one-off is done after one attempt). Recurring reminders stay 'active' — they have more occurrences pending. --- apps/bot/src/scheduler/fire-reminder.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/bot/src/scheduler/fire-reminder.ts b/apps/bot/src/scheduler/fire-reminder.ts index 5fc1e79..a78279a 100644 --- a/apps/bot/src/scheduler/fire-reminder.ts +++ b/apps/bot/src/scheduler/fire-reminder.ts @@ -1,5 +1,5 @@ import { eq } from "drizzle-orm"; -import { reminderRuns, reminderRunTargets } from "@cmbot/db"; +import { reminderRuns, reminderRunTargets, reminders } from "@cmbot/db"; import { db } from "../db.js"; import { logger } from "../logger.js"; import { sessionManager } from "../whatsapp/session-manager.js"; @@ -119,6 +119,16 @@ export async function fireReminder(payload: FireReminderPayload): Promise .set({ status }) .where(eq(reminderRuns.id, runId)); + // One-off reminders are done after firing — flip them to 'ended' so the + // menu shows ⚪ instead of 🟢. Recurring reminders stay 'active' (more + // occurrences pending; recurring is a future-plan feature). + if (reminder.scheduleKind === "one_off") { + await db + .update(reminders) + .set({ status: "ended", updatedAt: new Date() }) + .where(eq(reminders.id, reminder.id)); + } + await writeAuditLog(db, { operatorId: reminder.createdBy, source: "system",