139 lines
4.0 KiB
Plaintext
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])
|
|
}
|
|
|