// Modèle R0 — identité & permissions (docs/03-architecture/modele-donnees.md). // La matrice rôles × objets × droits vit EN BASE ; le JWT ne porte jamais de droits. generator client { provider = "prisma-client-js" // Cibles explicites : poste de dev (native) + conteneur node:24-slim // (OpenSSL 3) en x64 (serveur partenaire) et arm64 (répétition locale). binaryTargets = ["native", "debian-openssl-3.0.x", "linux-arm64-openssl-3.0.x"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model Role { id String @id @default(uuid()) @db.Uuid name String @unique // 7 rôles seedés — voir @siop/shared ROLE_NAMES users User[] permissions Permission[] } model Permission { id String @id @default(uuid()) @db.Uuid roleId String @db.Uuid role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) objectCategory String // enum applicatif — voir @siop/shared OBJECT_CATEGORIES canView Boolean @default(false) canViewOther Boolean @default(false) // « voir autre » : au-delà de ses propres objets canCreate Boolean @default(false) canEdit Boolean @default(false) canDelete Boolean @default(false) @@unique([roleId, objectCategory]) } model User { id String @id @default(uuid()) @db.Uuid email String @unique displayName String passwordHash String? // null tant que le compte n'est pas activé (R1) roleId String @db.Uuid role Role @relation(fields: [roleId], references: [id]) isActive Boolean @default(true) isDemo Boolean @default(false) // seul un compte isDemo est empruntable (ADR-002) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([roleId]) }