3.8 KiB
3.8 KiB
Setrip — Admin System Health Roadmap (ARCHIVED — DELIVERED 2026-05-18)
Admin perlu visibilitas atas job otomatis (cron) dan alert untuk state stale.
Status delivery
| Phase | Status | Catatan |
|---|---|---|
| Phase 1 — Cron Run Log | ✅ Delivered | Model CronRun, helper runCron(), wire ke cron existing. |
| Phase 2 — System Status Page | ✅ Delivered | /admin/system tampilkan summary cron + 20 run terakhir + health badge. |
| Phase 3 — Stale State Alerts | ✅ Delivered | systemHealthService.detectStale() cek 4 kategori (Payment AWAITING > 25h, AWAITING_PAY past departure, Payout HELD overdue, Refund APPROVED > 7d). Banner di /admin/system. |
| Phase 4 — Discord Webhook Notify | ✅ Delivered | notifyAdmins() POST ke ADMIN_ALERT_WEBHOOK_URL. Trigger otomatis saat cron FAILED via runCron. |
Phase 1 — Cron Run Log ✅
| # | Item | Status | File |
|---|---|---|---|
| 1.1 | Model CronRun + enum CronRunStatus + migration |
✅ | prisma/schema.prisma + prisma/migrations/20260518170000_add_cron_run/ |
| 1.2 | Helper runCron(jobName, fn) — auto create RUNNING row → SUCCESS/FAILED |
✅ | lib/cron-runner.ts |
| 1.3 | Wire runCron di auto-complete-trips cron |
✅ | app/api/cron/auto-complete-trips/route.ts |
Phase 2 — System Status Page ✅
| # | Item | Status | File |
|---|---|---|---|
| 2.1 | Per-job summary: last run, last success, count 7d, error count 7d | ✅ | app/admin/system/page.tsx |
| 2.2 | 20 cron run terakhir di table bawah | ✅ | app/admin/system/page.tsx |
| 2.3 | Health badge (🟢 OK < 25h, 🟡 STALE, 🔴 FAILED) | ✅ | app/admin/system/page.tsx |
| 2.4 | Link "System" di admin navbar | ✅ | components/admin/admin-sidebar.tsx |
Phase 3 — Stale State Alerts ✅
| # | Item | Status | File |
|---|---|---|---|
| 3.1 | systemHealthService.detectStale() return 4 count |
✅ | server/services/system-health.service.ts |
| 3.2 | Banner alerts kuning di /admin/system kalau ada count > 0 |
✅ | app/admin/system/page.tsx |
| 3.3 | Link tiap alert ke filtered list page yang relevan | ✅ (untuk Payout HELD & Refund APPROVED) | app/admin/system/page.tsx |
Threshold draft (review setelah jalan 1-2 minggu):
- Payment MIDTRANS
AWAITINGcreatedAt > 25 jam — suspect webhook tertunda - Booking
AWAITING_PAYdengan trip.date < today — peserta lupa bayar - Payout
HELDdengan heldUntil > 1 hari lewat — cron release tidak jalan - Refund
APPROVEDreviewedAt > 7 hari — admin lupa process
Phase 4 — Discord Webhook Notify ✅
| # | Item | Status | File |
|---|---|---|---|
| 4.1 | Helper notifyAdmins(message) — POST ke Discord webhook URL dari env |
✅ | lib/admin-notify.ts |
| 4.2 | Trigger notify di runCron saat FAILED (fire-and-forget) |
✅ | lib/cron-runner.ts |
| 4.3 | Trigger notify dari systemHealthService.detectStale rate-limited |
⏳ | Skip — admin sudah lihat banner di /admin/system saat buka pagi. Push notif harian baru worth it kalau admin sering miss; bisa ditambah belakangan. |
Tindakan manual ops:
- Apply migration (sudah di Phase 1).
- (Opsional) Buat Discord channel internal + webhook URL → set env
ADMIN_ALERT_WEBHOOK_URLdi PM2/server. Tanpa env,notifyAdminsno-op. - Test alert: trigger cron secara sengaja fail (mis. matikan DB sebentar) → cek Discord channel menerima 🚨 message.