Skip to content

Scheduler API Flows

No authentication. Called by external cron jobs.

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)
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)

Handler: src/queues/scheduler-notification-consumer.ts

Dispatches to:

  • processDraftNotification — draft reminder
  • processDelayReportNotification — delay report alert

Failed socket calls release the claim flag for retry on next scheduler run.