// 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 // z.B. "Raum 1.12", "Lager Keller" devices Device[] } /* ────────────────────────────────────────── Geräte / Inventar ────────────────────────────────────────── */ model Device { id String @id @default(cuid()) // Fachliche Felder name String // Anzeigename / Bezeichnung des Geräts manufacturer String // Hersteller model String // Modellbezeichnung inventoryNumber String @unique // Inventar-Nummer 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? // 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]) } /* ────────────────────────────────────────── History / Änderungsverlauf ────────────────────────────────────────── */ enum DeviceChangeType { CREATED UPDATED DELETED } model DeviceHistory { id String @id @default(cuid()) device Device @relation(fields: [deviceId], references: [id]) deviceId String changeType DeviceChangeType // Snapshot der Gerätedaten zum Zeitpunkt der Änderung // z.B. { inventoryNumber, serialNumber, productNumber, groupId, locationId, comment, ... } snapshot Json changedAt DateTime @default(now()) changedBy User? @relation("DeviceHistoryChangedBy", fields: [changedById], references: [id]) changedById String? @@index([deviceId, changedAt]) }