SPB Git forge

spb/spb-cloud

Public
10commits 1branches 0releases
3.2 MBsize
maindefault branch
1 h agolast push
JavaScript 56.7% TypeScript 42.6%
10.4 KB · 363 lines
Raw Blame History
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