Initial commit: add .gitignore and README
This commit is contained in:
137
prisma/migrations/20251206160518_init/migration.sql
Normal file
137
prisma/migrations/20251206160518_init/migration.sql
Normal file
@@ -0,0 +1,137 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "sites" (
|
||||
"id" TEXT NOT NULL,
|
||||
"omada_site_id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"region" TEXT,
|
||||
"timezone" TEXT,
|
||||
"country" TEXT,
|
||||
"address" TEXT,
|
||||
"contact" TEXT,
|
||||
"phone" TEXT,
|
||||
"email" TEXT,
|
||||
"note" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "sites_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "devices" (
|
||||
"id" TEXT NOT NULL,
|
||||
"omada_device_id" TEXT,
|
||||
"mac" TEXT NOT NULL,
|
||||
"site_id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"ip" TEXT,
|
||||
"model" TEXT NOT NULL,
|
||||
"type" TEXT NOT NULL,
|
||||
"status" TEXT NOT NULL,
|
||||
"health_score" INTEGER,
|
||||
"firmware_version" TEXT,
|
||||
"license_status" TEXT,
|
||||
"license_due_date" TIMESTAMP(3),
|
||||
"last_seen_at" TIMESTAMP(3),
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "devices_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "config_templates" (
|
||||
"id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"type" TEXT NOT NULL,
|
||||
"payload" JSONB NOT NULL,
|
||||
"description" TEXT,
|
||||
"created_by" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "config_templates_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "device_config_applied" (
|
||||
"id" TEXT NOT NULL,
|
||||
"device_id" TEXT NOT NULL,
|
||||
"config_template_id" TEXT NOT NULL,
|
||||
"status" TEXT NOT NULL,
|
||||
"applied_at" TIMESTAMP(3),
|
||||
"result_payload" JSONB,
|
||||
"error_message" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "device_config_applied_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "audit_logs" (
|
||||
"id" TEXT NOT NULL,
|
||||
"user_id" TEXT,
|
||||
"service_account" TEXT,
|
||||
"action" TEXT NOT NULL,
|
||||
"target_type" TEXT NOT NULL,
|
||||
"target_id" TEXT NOT NULL,
|
||||
"details" JSONB,
|
||||
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "audit_logs_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "sites_omada_site_id_key" ON "sites"("omada_site_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "sites_omada_site_id_idx" ON "sites"("omada_site_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "devices_site_id_idx" ON "devices"("site_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "devices_mac_idx" ON "devices"("mac");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "devices_omada_device_id_idx" ON "devices"("omada_device_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "devices_status_idx" ON "devices"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "devices_site_id_mac_key" ON "devices"("site_id", "mac");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "config_templates_type_idx" ON "config_templates"("type");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "device_config_applied_device_id_idx" ON "device_config_applied"("device_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "device_config_applied_config_template_id_idx" ON "device_config_applied"("config_template_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "device_config_applied_status_idx" ON "device_config_applied"("status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "audit_logs_user_id_idx" ON "audit_logs"("user_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "audit_logs_action_idx" ON "audit_logs"("action");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "audit_logs_target_type_target_id_idx" ON "audit_logs"("target_type", "target_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "audit_logs_timestamp_idx" ON "audit_logs"("timestamp");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "devices" ADD CONSTRAINT "devices_site_id_fkey" FOREIGN KEY ("site_id") REFERENCES "sites"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "device_config_applied" ADD CONSTRAINT "device_config_applied_device_id_fkey" FOREIGN KEY ("device_id") REFERENCES "devices"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "device_config_applied" ADD CONSTRAINT "device_config_applied_config_template_id_fkey" FOREIGN KEY ("config_template_id") REFERENCES "config_templates"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,31 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "vlans" (
|
||||
"id" TEXT NOT NULL,
|
||||
"omada_vlan_id" TEXT,
|
||||
"site_id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"vlan_id" INTEGER NOT NULL,
|
||||
"subnet" TEXT NOT NULL,
|
||||
"gateway" TEXT,
|
||||
"dhcp_enabled" BOOLEAN NOT NULL DEFAULT false,
|
||||
"description" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "vlans_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "vlans_site_id_idx" ON "vlans"("site_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "vlans_vlan_id_idx" ON "vlans"("vlan_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "vlans_omada_vlan_id_idx" ON "vlans"("omada_vlan_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "vlans_site_id_vlan_id_key" ON "vlans"("site_id", "vlan_id");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "vlans" ADD CONSTRAINT "vlans_site_id_fkey" FOREIGN KEY ("site_id") REFERENCES "sites"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
3
prisma/migrations/migration_lock.toml
Normal file
3
prisma/migrations/migration_lock.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (i.e. Git)
|
||||
provider = "postgresql"
|
||||
138
prisma/schema.prisma
Normal file
138
prisma/schema.prisma
Normal file
@@ -0,0 +1,138 @@
|
||||
// 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])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user