fix(scheduler): flip one-off reminders to 'ended' after firing

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.
This commit is contained in:
yiekheng 2026-05-09 17:52:36 +08:00
parent 6a221fe043
commit 92deaf1032

View File

@ -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<void>
.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",