geraete/prisma/schema.prisma
2025-11-17 15:26:43 +01:00

159 lines
4.7 KiB
Plaintext

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
/* ──────────────────────────────────────────
Rollen / Rechte
────────────────────────────────────────── */
model User {
id String @id @default(cuid())
email String @unique
username String @unique
name String?
passwordHash String
roles UserRole[]
// Audit-Relations
devicesCreated Device[] @relation("DeviceCreatedBy")
devicesUpdated Device[] @relation("DeviceUpdatedBy")
historyEntries DeviceHistory[] @relation("DeviceHistoryChangedBy")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Role {
id String @id @default(cuid())
name String @unique // z.B. "ADMIN", "INVENTUR", "READONLY"
users UserRole[]
}
// Join-Tabelle User <-> Role (Many-to-Many)
model UserRole {
user User @relation(fields: [userId], references: [id])
userId String
role Role @relation(fields: [roleId], references: [id])
roleId String
assignedAt DateTime @default(now())
@@id([userId, roleId])
}
/* ──────────────────────────────────────────
Stammdaten: Gruppen & Standorte
────────────────────────────────────────── */
model DeviceGroup {
id String @id @default(cuid())
name String @unique
devices Device[]
}
model Location {
id String @id @default(cuid())
name String @unique
devices Device[]
}
/* ──────────────────────────────────────────
Geräte / Inventar
────────────────────────────────────────── */
model Device {
inventoryNumber String @id @unique // Inventar-Nummer
// Fachliche Felder
name String // Anzeigename / Bezeichnung des Geräts
manufacturer String // Hersteller
model String // Modellbezeichnung
serialNumber String? // Seriennummer
productNumber String? // Produktnummer
comment String?
ipv4Address String? @unique // IPv4-Adresse
ipv6Address String? @unique // IPv6-Adresse
macAddress String? @unique // MAC-Adresse
username String? @unique // Benutzername
passwordHash String? @unique // Passwort
// Beziehungen
group DeviceGroup? @relation(fields: [groupId], references: [id])
groupId String?
location Location? @relation(fields: [locationId], references: [id])
locationId String?
tags Tag[]
// Audit-Felder
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
createdBy User? @relation("DeviceCreatedBy", fields: [createdById], references: [id])
createdById String?
updatedBy User? @relation("DeviceUpdatedBy", fields: [updatedById], references: [id])
updatedById String?
// Historie
history DeviceHistory[]
@@index([inventoryNumber])
@@index([groupId])
@@index([locationId])
}
model Tag {
id String @id @default(cuid())
name String @unique
devices Device[] // implizite Join-Tabelle
}
/* ──────────────────────────────────────────
History / Änderungsverlauf
────────────────────────────────────────── */
enum DeviceChangeType {
CREATED
UPDATED
DELETED
}
model DeviceHistory {
id String @id @default(cuid())
deviceId String
device Device @relation(fields: [deviceId], references: [inventoryNumber])
changeType DeviceChangeType
snapshot Json
changedAt DateTime @default(now())
// 🔹 FK-Spalte
changedById String?
// 🔹 Relation zu User
changedBy User? @relation("DeviceHistoryChangedBy", fields: [changedById], references: [id])
@@index([deviceId, changedAt])
@@index([changedById])
}