Files
Datacenter-Control-Complete/prisma/schema.prisma
2026-02-09 21:51:31 -08:00

139 lines
4.0 KiB
Plaintext

// This is your Prisma schema file,
// learn more about the schema in https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Site {
id String @id @default(uuid())
omadaSiteId String @unique @map("omada_site_id")
name String
region String?
timezone String?
country String?
address String?
contact String?
phone String?
email String?
note String?
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
devices Device[]
vlans Vlan[]
@@map("sites")
@@index([omadaSiteId])
}
model Device {
id String @id @default(uuid())
omadaDeviceId String? @map("omada_device_id")
mac String
siteId String @map("site_id")
name String
ip String?
model String
type String
status String
healthScore Int? @map("health_score")
firmwareVersion String? @map("firmware_version")
licenseStatus String? @map("license_status")
licenseDueDate DateTime? @map("license_due_date")
lastSeenAt DateTime? @map("last_seen_at")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
site Site @relation(fields: [siteId], references: [id], onDelete: Cascade)
configApplied DeviceConfigApplied[]
@@unique([siteId, mac])
@@map("devices")
@@index([siteId])
@@index([mac])
@@index([omadaDeviceId])
@@index([status])
}
model ConfigTemplate {
id String @id @default(uuid())
name String
type String // gateway, switch, ssid, etc.
payload Json // Omada config schema
description String?
createdBy String? @map("created_by")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
configApplied DeviceConfigApplied[]
@@map("config_templates")
@@index([type])
}
model DeviceConfigApplied {
id String @id @default(uuid())
deviceId String @map("device_id")
configTemplateId String @map("config_template_id")
status String // pending, success, failed
appliedAt DateTime? @map("applied_at")
resultPayload Json? @map("result_payload")
errorMessage String? @map("error_message")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
device Device @relation(fields: [deviceId], references: [id], onDelete: Cascade)
template ConfigTemplate @relation(fields: [configTemplateId], references: [id])
@@map("device_config_applied")
@@index([deviceId])
@@index([configTemplateId])
@@index([status])
}
model Vlan {
id String @id @default(uuid())
omadaVlanId String? @map("omada_vlan_id")
siteId String @map("site_id")
name String
vlanId Int @map("vlan_id")
subnet String
gateway String?
dhcpEnabled Boolean @default(false) @map("dhcp_enabled")
description String?
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
site Site @relation(fields: [siteId], references: [id], onDelete: Cascade)
@@unique([siteId, vlanId])
@@map("vlans")
@@index([siteId])
@@index([vlanId])
@@index([omadaVlanId])
}
model AuditLog {
id String @id @default(uuid())
userId String? @map("user_id")
serviceAccount String? @map("service_account")
action String // e.g., "set_port_vlan", "reboot_device"
targetType String @map("target_type") // site, device, client
targetId String @map("target_id")
details Json? // Additional context
timestamp DateTime @default(now())
@@map("audit_logs")
@@index([userId])
@@index([action])
@@index([targetType, targetId])
@@index([timestamp])
}