Scheduler API Flows
No authentication. Called by external cron jobs.
Draft notification
Section titled “Draft notification”sequenceDiagram
participant Cron as External Scheduler
participant Worker as second_opinion
participant D1 as D1
participant Q as SCHEDULER_NOTIFICATION_QUEUE
participant Consumer as Queue Consumer
participant Sock as Socket Hub
Cron->>Worker: GET /scheduler/draftNotification
Worker->>D1: SELECT draft cases ≥ 24h, draft_notif_sent=0
loop each eligible case
Worker->>D1: claim row (set draft_notif_sent)
Worker->>Q: enqueue { kind: draft, case_id, user_id }
end
Worker-->>Cron: { eligible, enqueued }
Q->>Consumer: batch messages
Consumer->>Sock: POST /worker/notification (UCP98)
Delay report notification
Section titled “Delay report notification”sequenceDiagram
participant Cron as External Scheduler
participant Worker as second_opinion
participant D1 as D1
participant Q as SCHEDULER_NOTIFICATION_QUEUE
participant Consumer as Queue Consumer
participant Sock as Socket Hub
Cron->>Worker: GET /scheduler/sendDelayReportNotification
Worker->>D1: SELECT overdue cases, delay_report_sent=0
loop each eligible case
Worker->>D1: claim row
Worker->>Q: enqueue { kind: delay_report, case_id, user_id }
end
Worker-->>Cron: { eligible, enqueued }
Q->>Consumer: batch messages
Consumer->>Sock: POST /worker/notification (UCP105)
Queue consumer
Section titled “Queue consumer”Handler: src/queues/scheduler-notification-consumer.ts
Dispatches to:
processDraftNotification— draft reminderprocessDelayReportNotification— delay report alert
Failed socket calls release the claim flag for retry on next scheduler run.