admin roadmap filter & search, user management, reopen rejected, system health
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
-- AlterTable: tambah kemampuan admin untuk suspend/ban user (moderasi scam,
|
||||
-- harassment, TOS violation). Suspended user diblokir sign-in dan dilarang
|
||||
-- melakukan aksi mutatif. Hard-delete dihindari supaya audit trail terjaga.
|
||||
ALTER TABLE "User" ADD COLUMN "suspended" BOOLEAN NOT NULL DEFAULT false;
|
||||
ALTER TABLE "User" ADD COLUMN "suspendedAt" TIMESTAMP(3);
|
||||
ALTER TABLE "User" ADD COLUMN "suspendedReason" TEXT;
|
||||
ALTER TABLE "User" ADD COLUMN "suspendedById" TEXT;
|
||||
|
||||
-- AddForeignKey: admin yang suspend tetap auditable kalau admin dihapus.
|
||||
ALTER TABLE "User" ADD CONSTRAINT "User_suspendedById_fkey"
|
||||
FOREIGN KEY ("suspendedById") REFERENCES "User"("id")
|
||||
ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- CreateIndex: filter user list admin sering pakai suspended status.
|
||||
CREATE INDEX "User_suspended_idx" ON "User"("suspended");
|
||||
@@ -0,0 +1,22 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "CronRunStatus" AS ENUM ('RUNNING', 'SUCCESS', 'FAILED');
|
||||
|
||||
-- CreateTable: log per cron run untuk observability admin. Append-only.
|
||||
CREATE TABLE "CronRun" (
|
||||
"id" TEXT NOT NULL,
|
||||
"jobName" TEXT NOT NULL,
|
||||
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"finishedAt" TIMESTAMP(3),
|
||||
"status" "CronRunStatus" NOT NULL DEFAULT 'RUNNING',
|
||||
"errorMessage" TEXT,
|
||||
"payload" JSONB,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "CronRun_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex: query "last run per job" sering — pakai composite index.
|
||||
CREATE INDEX "CronRun_jobName_startedAt_idx" ON "CronRun"("jobName", "startedAt" DESC);
|
||||
|
||||
-- CreateIndex: query "recent runs across all jobs" untuk admin dashboard.
|
||||
CREATE INDEX "CronRun_startedAt_idx" ON "CronRun"("startedAt" DESC);
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user