150 lines
4.6 KiB
Plaintext
150 lines
4.6 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())
|
|
changedById String?
|
|
changedBy User? @relation("DeviceHistoryChangedBy", fields: [changedById], references: [id])
|
|
}
|
|
|
|
|
|
|