From d6b87074804f820f06c325060aab51bbc75fad8e Mon Sep 17 00:00:00 2001 From: arsam Date: Fri, 18 Sep 2026 23:09:08 +0330 Subject: [PATCH] Import source: backend/prisma/schema.prisma Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality. --- backend/prisma/schema.prisma | 406 +++++++++++++++++++++++++++++++++++ 1 file changed, 406 insertions(+) create mode 100644 backend/prisma/schema.prisma diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma new file mode 100644 index 0000000..677bcdf --- /dev/null +++ b/backend/prisma/schema.prisma @@ -0,0 +1,406 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +// ========================================== +// ENUMS +// ========================================== + +enum Status { + healthy + warning + critical + maintenance + disabled +} + +enum Runtime { + Static + PHP + Node_js @map("Node.js") + Python + Ruby + Docker + Reverse_proxy @map("Reverse proxy") + Custom_service @map("Custom service") +} + +enum Environment { + production + staging +} + +enum DomainType { + primary + addon + alias + subdomain + parked +} + +enum DnsRecordType { + A + AAAA + CNAME + MX + TXT + SRV + CAA + NS + PTR +} + +enum DatabaseEngine { + MySQL + MariaDB + PostgreSQL +} + +enum BackupScope { + full + website + database + email + configuration + snapshot +} + +enum SecuritySeverity { + critical + high + medium + low +} + +enum SecurityStatus { + open + acknowledged + resolved +} + +enum NotificationCategory { + security + backup + resource + ssl + deployment + system +} + +enum Permission { + dashboard_read @map("dashboard:read") + tools_read @map("tools:read") + websites_manage @map("websites:manage") + domains_manage @map("domains:manage") + files_manage @map("files:manage") + databases_manage @map("databases:manage") + email_manage @map("email:manage") + metrics_read @map("metrics:read") + security_manage @map("security:manage") + software_manage @map("software:manage") + advanced_manage @map("advanced:manage") + servers_manage @map("servers:manage") + users_manage @map("users:manage") + resellers_manage @map("resellers:manage") + backups_manage @map("backups:manage") + automation_manage @map("automation:manage") + notifications_read @map("notifications:read") + audit_read @map("audit:read") + support_manage @map("support:manage") + settings_manage @map("settings:manage") +} + +// ========================================== +// MODELS +// ========================================== + +model User { + id String @id @default(cuid()) + name String + email String @unique + passwordHash String? + role String // String allows custom roles (e.g. "Super administrator") + avatarInitials String + twoFactorEnabled Boolean @default(false) + lastLogin DateTime @default(now()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + sessions Session[] + permissions UserPermission[] + accounts AccountUser[] +} + +model Session { + id String @id @default(uuid()) + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + expiresAt DateTime + createdAt DateTime @default(now()) + userAgent String? + ipAddress String? + challenge String? // Stores authentication flow state, e.g. "totp" or null +} + +model UserPermission { + id String @id @default(cuid()) + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + permission Permission + + @@unique([userId, permission]) +} + +model HostingAccount { + id String @id @default(cuid()) + username String @unique + primaryDomain String + homeDirectory String + sharedIp String + dedicatedIp String? + theme String @default("system") // "system" | "light" | "dark" + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + users AccountUser[] + websites Website[] + domains Domain[] + databases Database[] + mailboxes Mailbox[] + backups Backup[] + automations Automation[] + notifications Notification[] + auditEntries AuditEntry[] + resourceUsage ResourceUsage[] + metricPoints MetricPoint[] + findings SecurityFinding[] +} + +model AccountUser { + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) + + @@id([userId, accountId]) +} + +model Website { + id String @id @default(cuid()) + name String + domain String // Primary domain name for the website + runtime Runtime + status Status @default(healthy) + ssl Status @default(healthy) + repository String? + environment Environment @default(production) + cpuLimit String // e.g. "2 vCPU" + memoryLimit String // e.g. "2 GB" + lastDeployment DateTime? + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) + domains Domain[] // Domains mapped to this website +} + +model Domain { + id String @id @default(cuid()) + name String @unique // Domain name (e.g. "example.com") + type DomainType + documentRoot String + sslStatus Status @default(healthy) + dnssec Boolean @default(false) + propagation Int @default(100) // Percentage (0-100) + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) + websiteId String? + website Website? @relation(fields: [websiteId], references: [id], onDelete: SetNull) + dnsRecords DnsRecord[] + mailboxes Mailbox[] +} + +model DnsRecord { + id String @id @default(cuid()) + name String // e.g. "www.example.com." + ttl Int @default(14400) + class String @default("IN") + type DnsRecordType + record String // Record value (e.g. IP address, text string, target) + priority Int? // Optional priority for MX/SRV records + warning String? // Optional validation warnings + + // Relations + domainId String + domain Domain @relation(fields: [domainId], references: [id], onDelete: Cascade) +} + +model Server { + id String @id @default(cuid()) + name String + hostname String + os String + panelVersion String + load1 Float // 1-min load average + load5 Float // 5-min load average + load15 Float // 15-min load average + ipAddress String + status Status @default(healthy) + location String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Database { + id String @id @default(cuid()) + name String @unique + engine DatabaseEngine + size BigInt // Storage size in bytes + tables Int @default(0) + connections Int @default(0) + lastBackup DateTime? + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) + users DatabaseUserAccess[] +} + +model DatabaseUser { + id String @id @default(cuid()) + username String @unique + databases DatabaseUserAccess[] +} + +model DatabaseUserAccess { + databaseId String + database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade) + username String // Foreign key pointing to DatabaseUser.username + user DatabaseUser @relation(fields: [username], references: [username], onDelete: Cascade) + + @@id([databaseId, username]) +} + +model Mailbox { + id String @id @default(cuid()) + address String @unique // e.g. "admin@example.com" + used BigInt @default(0) // Storage used in bytes + quota BigInt // Storage quota in bytes + lastLogin DateTime? + forwarding Boolean @default(false) + spamScore Float @default(0.0) + authStatus Status @default(healthy) + + // Relations + domainId String + domain Domain @relation(fields: [domainId], references: [id], onDelete: Cascade) + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) +} + +model ResourceUsage { + id String @id @default(cuid()) + key String // e.g. "disk", "bandwidth", "cpu", "memory" + label String + used Float + limit Float + unit String + status Status + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) + + @@unique([accountId, key]) +} + +model MetricPoint { + id String @id @default(cuid()) + timestamp DateTime @default(now()) + cpu Float + memory Float + disk Float + bandwidth Float + requests Int + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) +} + +model SecurityFinding { + id String @id @default(cuid()) + severity SecuritySeverity + title String + target String + status SecurityStatus @default(open) + recommendation String + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) +} + +model Backup { + id String @id @default(cuid()) + name String + scope BackupScope + destination String + size BigInt + status Status + encrypted Boolean @default(true) + createdAt DateTime @default(now()) + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) +} + +model Automation { + id String @id @default(cuid()) + name String + trigger String + status Status + lastRun DateTime? + successRate Int @default(100) + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) +} + +model Notification { + id String @id @default(cuid()) + title String + category NotificationCategory + read Boolean @default(false) + createdAt DateTime @default(now()) + body String + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) +} + +model AuditEntry { + id String @id @default(cuid()) + actor String + action String + target String + ipAddress String + createdAt DateTime @default(now()) + requestId String + + // Relations + accountId String + account HostingAccount @relation(fields: [accountId], references: [id], onDelete: Cascade) +}