admin roadmap filter & search, user management, reopen rejected, system health

This commit is contained in:
2026-05-18 19:45:14 +07:00
parent c52b12daad
commit 6e02f2f0d7
36 changed files with 2013 additions and 339 deletions
+32
View File
@@ -20,6 +20,13 @@ model User {
acceptedTermsAndPrivacy Boolean @default(false)
/// Waktu user menyetujui Syarat & Ketentuan dan Kebijakan Privasi
acceptedAt DateTime?
/// Suspended user diblokir sign-in dan aksi mutatif. Set oleh admin via panel.
suspended Boolean @default(false)
suspendedAt DateTime?
suspendedReason String?
suspendedById String?
suspendedBy User? @relation("UserSuspendedBy", fields: [suspendedById], references: [id], onDelete: SetNull)
suspendedUsers User[] @relation("UserSuspendedBy")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -438,6 +445,31 @@ model Refund {
@@index([status, createdAt])
}
/// Log per cron run untuk observability admin. Append-only.
/// `runCron(jobName, fn)` di `lib/cron-runner.ts` otomatis create row RUNNING
/// → update SUCCESS/FAILED setelah selesai. Dipakai admin di `/admin/system`.
model CronRun {
id String @id @default(cuid())
jobName String
startedAt DateTime @default(now())
finishedAt DateTime?
status CronRunStatus @default(RUNNING)
errorMessage String?
/// Snapshot ringkas hasil run (mis. `{ completed: 5, ids: [...] }`).
payload Json?
createdAt DateTime @default(now())
@@index([jobName, startedAt(sort: Desc)])
@@index([startedAt(sort: Desc)])
}
enum CronRunStatus {
RUNNING
SUCCESS
FAILED
}
enum RefundReason {
/// Peserta cancel booking sendiri (mengikuti refund window policy).
USER_CANCELLATION