134 lines
3.8 KiB
Plaintext
134 lines
3.8 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
output = "../generated"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_ADMIN_URL")
|
|
}
|
|
|
|
// ─── Platform SuperAdmins ────────────────────────────
|
|
|
|
model SuperAdmin {
|
|
id String @id @default(uuid())
|
|
email String @unique
|
|
password String
|
|
firstName String
|
|
lastName String
|
|
isActive Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
refreshTokens AdminRefreshToken[]
|
|
auditLogs PlatformAuditLog[]
|
|
assignedTickets SupportTicket[] @relation("TicketAssignee")
|
|
ticketComments SupportTicketComment[]
|
|
|
|
@@map("super_admins")
|
|
}
|
|
|
|
model AdminRefreshToken {
|
|
id String @id @default(uuid())
|
|
token String @unique
|
|
adminId String
|
|
expiresAt DateTime
|
|
createdAt DateTime @default(now())
|
|
|
|
admin SuperAdmin @relation(fields: [adminId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([adminId])
|
|
@@index([expiresAt])
|
|
@@map("admin_refresh_tokens")
|
|
}
|
|
|
|
// ─── Platform Audit Log ──────────────────────────────
|
|
|
|
model PlatformAuditLog {
|
|
id String @id @default(uuid())
|
|
adminId String
|
|
action String
|
|
target String?
|
|
details Json @default("{}")
|
|
ipAddress String?
|
|
createdAt DateTime @default(now())
|
|
|
|
admin SuperAdmin @relation(fields: [adminId], references: [id])
|
|
|
|
@@index([adminId])
|
|
@@index([action])
|
|
@@index([target])
|
|
@@index([createdAt])
|
|
@@map("platform_audit_logs")
|
|
}
|
|
|
|
// ─── Support Tickets (Tenant → Platform) ─────────────
|
|
|
|
model SupportTicket {
|
|
id String @id @default(uuid())
|
|
tenantId String
|
|
tenantName String
|
|
tenantSlug String
|
|
createdById String
|
|
createdByName String
|
|
subject String
|
|
description String
|
|
category String @default("general") // billing, technical, account, general, feature_request
|
|
priority String @default("normal") // low, normal, high, urgent
|
|
status String @default("open") // open, in_progress, waiting_tenant, resolved, closed
|
|
assignedToId String?
|
|
resolvedAt DateTime?
|
|
closedAt DateTime?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
assignee SuperAdmin? @relation("TicketAssignee", fields: [assignedToId], references: [id])
|
|
comments SupportTicketComment[]
|
|
attachments SupportTicketAttachment[]
|
|
|
|
@@index([tenantId])
|
|
@@index([status])
|
|
@@index([category])
|
|
@@index([priority])
|
|
@@index([assignedToId])
|
|
@@index([createdAt])
|
|
@@map("support_tickets")
|
|
}
|
|
|
|
model SupportTicketComment {
|
|
id String @id @default(uuid())
|
|
ticketId String
|
|
authorId String
|
|
authorName String
|
|
authorType String // "super_admin" or "tenant_user"
|
|
content String
|
|
createdAt DateTime @default(now())
|
|
|
|
ticket SupportTicket @relation(fields: [ticketId], references: [id], onDelete: Cascade)
|
|
author SuperAdmin? @relation(fields: [authorId], references: [id])
|
|
attachments SupportTicketAttachment[]
|
|
|
|
@@index([ticketId])
|
|
@@index([authorId])
|
|
@@map("support_ticket_comments")
|
|
}
|
|
|
|
model SupportTicketAttachment {
|
|
id String @id @default(uuid())
|
|
ticketId String
|
|
commentId String?
|
|
fileName String
|
|
originalName String
|
|
mimeType String
|
|
sizeBytes Int
|
|
uploadedBy String
|
|
createdAt DateTime @default(now())
|
|
|
|
ticket SupportTicket @relation(fields: [ticketId], references: [id], onDelete: Cascade)
|
|
comment SupportTicketComment? @relation(fields: [commentId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([ticketId])
|
|
@@index([commentId])
|
|
@@map("support_ticket_attachments")
|
|
}
|