// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" output = "../src/generated/client" binaryTargets = ["native", "linux-musl-arm64-openssl-3.0.x", "linux-musl-openssl-3.0.x"] } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model User { id String @id @default(uuid()) username String? @unique email String @unique passwordHash String name String role String @default("USER") mustResetPassword Boolean @default(false) isActive Boolean @default(true) drawings Drawing[] collections Collection[] passwordResetTokens PasswordResetToken[] refreshTokens RefreshToken[] auditLogs AuditLog[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model SystemConfig { id String @id @default("default") registrationEnabled Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Collection { id String @id @default(uuid()) name String userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) drawings Drawing[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Drawing { id String @id @default(uuid()) name String elements String // Stored as JSON string appState String // Stored as JSON string files String @default("{}") // Stored as JSON string preview String? // SVG string for thumbnail version Int @default(1) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) collectionId String? collection Collection? @relation(fields: [collectionId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Library { id String @id // User-specific library ID (e.g., "user_") items String @default("[]") // Stored as JSON string array of library items createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model PasswordResetToken { id String @id @default(uuid()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) token String @unique expiresAt DateTime used Boolean @default(false) createdAt DateTime @default(now()) } model RefreshToken { id String @id @default(uuid()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) token String @unique expiresAt DateTime revoked Boolean @default(false) createdAt DateTime @default(now()) } model AuditLog { id String @id @default(uuid()) userId String? user User? @relation(fields: [userId], references: [id], onDelete: SetNull) action String // e.g., "login", "login_failed", "password_reset", "password_changed", "drawing_deleted" resource String? // e.g., "drawing:123", "collection:456" ipAddress String? userAgent String? details String? // JSON string for additional details createdAt DateTime @default(now()) }