JavaScript 56.7%
TypeScript 42.6%
1generator client {2 provider = "prisma-client-js"3}45datasource db {6 provider = "sqlite"7 url = env("DATABASE_URL")8}910// ==================== USERS & AUTH ====================1112model User {13 id String @id @default(cuid())14 username String? @unique15 email String? @unique16 name String?17 avatarPath String?18 passwordHash String19 role String @default("user") // admin, user, viewer20 twoFactorSecret String?21 twoFactorEnabled Boolean @default(false)22 createdAt DateTime @default(now())23 updatedAt DateTime @default(now())2425 files File[]26 folders Folder[]27 permissions Permission[]28 notifications Notification[]29 apiKeys ApiKey[]30 activityLogs ActivityLog[]31 sharedSpaces SharedSpaceMember[]32 passwordEntries PasswordEntry[]33 comments Comment[]34 loginSessions LoginSession[]3536 @@index([email])37 @@index([role])38}3940// ==================== FILES & FOLDERS ====================4142model File {43 id String @id @default(cuid())44 name String45 storagePath String46 size BigInt47 mimeType String48 folderId String?49 userId String?50 folder Folder? @relation(fields: [folderId], references: [id], onDelete: SetNull)51 user User? @relation(fields: [userId], references: [id], onDelete: SetNull)52 isEncrypted Boolean @default(false)53 encryptionIV String?54 thumbnailPath String?55 ocrText String?56 aiTags String?57 aiDescription String?58 aiEmbedding String?5960 deletedAt DateTime?61 /// Dossier d'origine au moment de la mise à la corbeille (restauration fidèle)62 deletedFromFolderId String?63 /// Chemin d'origine sérialisé JSON {spaceId, names[]} si le dossier a disparu64 deletedFromPath String?65 createdAt DateTime @default(now())66 updatedAt DateTime @updatedAt67 sharedLinks SharedLink[]68 activities ActivityLog[]69 metadata FileMetadata?70 tags FileTag[]71 versions FileVersion[]72 comments Comment[]7374 @@index([folderId])75 @@index([userId])76 @@index([name])77 @@index([mimeType])78 @@index([createdAt])79 @@index([deletedAt])80}8182model Folder {83 id String @id @default(cuid())84 name String85 parentId String?86 userId String?87 sharedSpaceId String?88 parent Folder? @relation("FolderTree", fields: [parentId], references: [id], onDelete: Cascade)89 children Folder[] @relation("FolderTree")90 user User? @relation(fields: [userId], references: [id], onDelete: SetNull)91 sharedSpace SharedSpace? @relation(fields: [sharedSpaceId], references: [id], onDelete: SetNull)92 files File[]93 permissions Permission[]94 sharedLinks SharedLink[]95 createdAt DateTime @default(now())9697 @@index([parentId])98 @@index([userId])99 @@index([sharedSpaceId])100}101102// ==================== SHARING ====================103104model SharedLink {105 id String @id @default(cuid())106 /// Partage d'un fichier (exclusif avec folderId)107 fileId String?108 file File? @relation(fields: [fileId], references: [id], onDelete: Cascade)109 /// Partage d'un dossier complet (navigation + ZIP)110 folderId String?111 folder Folder? @relation(fields: [folderId], references: [id], onDelete: Cascade)112 token String @unique @default(cuid())113 expiresAt DateTime?114 passwordHash String?115 mode String @default("DOWNLOAD")116 active Boolean @default(true)117 accessCount Int @default(0)118 lastAccessAt DateTime?119 createdAt DateTime @default(now())120121 @@index([token])122 @@index([fileId])123 @@index([folderId])124}125126// ==================== PERMISSIONS ====================127128model Permission {129 id String @id @default(cuid())130 userId String131 folderId String132 user User @relation(fields: [userId], references: [id], onDelete: Cascade)133 folder Folder @relation(fields: [folderId], references: [id], onDelete: Cascade)134 level String @default("read") // read, write, admin135 createdAt DateTime @default(now())136137 @@unique([userId, folderId])138 @@index([userId])139 @@index([folderId])140}141142// ==================== ACTIVITY ====================143144model ActivityLog {145 id String @id @default(cuid())146 action String147 fileId String?148 userId String?149 file File? @relation(fields: [fileId], references: [id], onDelete: SetNull)150 user User? @relation(fields: [userId], references: [id], onDelete: SetNull)151 details String?152 createdAt DateTime @default(now())153154 @@index([createdAt])155 @@index([action])156 @@index([userId])157}158159// ==================== METADATA & TAGS ====================160161model FileMetadata {162 id String @id @default(cuid())163 fileId String @unique164 file File @relation(fields: [fileId], references: [id], onDelete: Cascade)165 description String?166 isFavorite Boolean @default(false)167 customDates String?168 annotations String?169 createdAt DateTime @default(now())170 updatedAt DateTime @updatedAt171}172173model Tag {174 id String @id @default(cuid())175 name String @unique176 color String @default("#6b7280")177 createdAt DateTime @default(now())178 files FileTag[]179}180181model FileTag {182 id String @id @default(cuid())183 fileId String184 tagId String185 file File @relation(fields: [fileId], references: [id], onDelete: Cascade)186 tag Tag @relation(fields: [tagId], references: [id], onDelete: Cascade)187188 @@unique([fileId, tagId])189 @@index([fileId])190 @@index([tagId])191}192193// ==================== VERSIONING ====================194195model FileVersion {196 id String @id @default(cuid())197 fileId String198 file File @relation(fields: [fileId], references: [id], onDelete: Cascade)199 versionNum Int200 storagePath String201 size BigInt202 changeNote String?203 createdAt DateTime @default(now())204205 @@unique([fileId, versionNum])206 @@index([fileId])207}208209// ==================== NOTIFICATIONS ====================210211model Notification {212 id String @id @default(cuid())213 userId String214 user User @relation(fields: [userId], references: [id], onDelete: Cascade)215 type String216 title String217 message String218 read Boolean @default(false)219 data String?220 createdAt DateTime @default(now())221222 @@index([userId, read])223 @@index([createdAt])224}225226// ==================== API KEYS ====================227228model ApiKey {229 id String @id @default(cuid())230 userId String231 user User @relation(fields: [userId], references: [id], onDelete: Cascade)232 name String233 keyHash String @unique234 keyPrefix String235 permissions String @default("read")236 lastUsedAt DateTime?237 expiresAt DateTime?238 createdAt DateTime @default(now())239240 @@index([keyHash])241 @@index([userId])242}243244// ==================== BACKUP ====================245246model BackupLog {247 id String @id @default(cuid())248 status String249 type String250 size BigInt?251 path String?252 error String?253 startedAt DateTime @default(now())254 completedAt DateTime?255}256257// ==================== SNAPSHOTS ====================258259model Snapshot {260 id String @id @default(cuid())261 label String // e.g. "Lundi 22 mars"262 snapshotDate String // YYYY-MM-DD — one snapshot per day263 path String // absolute directory path264 size BigInt @default(0)265 status String @default("pending") // pending, completed, failed266 error String?267 createdAt DateTime @default(now())268269 @@unique([snapshotDate])270 @@index([snapshotDate])271}272273// ==================== SHARED SPACES ====================274275// ==================== PASSWORD MANAGER ====================276277model PasswordEntry {278 id String @id @default(cuid())279 userId String280 user User @relation(fields: [userId], references: [id], onDelete: Cascade)281 siteName String282 siteUrl String?283 username String?284 password String // AES-256-GCM encrypted285 notes String?286 createdAt DateTime @default(now())287 updatedAt DateTime @updatedAt288289 @@index([userId])290 @@index([siteName])291}292293// ==================== SHARED SPACES ====================294295model SharedSpace {296 id String @id @default(cuid())297 name String298 quotaBytes BigInt @default(536870912000)299 createdAt DateTime @default(now())300 updatedAt DateTime @updatedAt301 members SharedSpaceMember[]302 folders Folder[]303304 @@index([name])305}306307model SharedSpaceMember {308 id String @id @default(cuid())309 sharedSpaceId String310 userId String311 sharedSpace SharedSpace @relation(fields: [sharedSpaceId], references: [id], onDelete: Cascade)312 user User @relation(fields: [userId], references: [id], onDelete: Cascade)313 joinedAt DateTime @default(now())314315 @@unique([sharedSpaceId, userId])316 @@index([sharedSpaceId])317 @@index([userId])318}319320// ==================== LOGIN SESSIONS (device tracking) ====================321322model LoginSession {323 id String @id @default(cuid())324 userId String325 user User @relation(fields: [userId], references: [id], onDelete: Cascade)326 sessionToken String @unique @default(cuid())327 ip String328 userAgent String @default("")329 device String @default("Desktop") // Desktop, Mobile, Tablet330 browser String @default("Inconnu")331 os String @default("Inconnu")332 country String @default("")333 city String @default("")334 status String @default("active") // active, ended, refused_by_ai335 aiDecision String? // "allowed" | "refused"336 aiReason String? // AI explanation337 aiRiskLevel String? // "low" | "medium" | "high"338 createdAt DateTime @default(now())339 endedAt DateTime?340341 @@index([userId])342 @@index([sessionToken])343 @@index([createdAt])344 @@index([status])345}346347// ==================== COMMENTS ====================348349model Comment {350 id String @id @default(cuid())351 fileId String352 userId String353 content String354 file File @relation(fields: [fileId], references: [id], onDelete: Cascade)355 user User @relation(fields: [userId], references: [id], onDelete: Cascade)356 createdAt DateTime @default(now())357 updatedAt DateTime @updatedAt358359 @@index([fileId])360 @@index([userId])361 @@index([createdAt])362}363