generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" } enum Role { ADMIN PARTNER_USER } enum DocumentType { NDA MSA } model Organization { id String @id @default(uuid()) name String status String @default("ACTIVE") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt users User[] sharedAssets SharedAsset[] } model User { id String @id @default(uuid()) email String @unique passwordHash String role Role @default(PARTNER_USER) mfaEnabled Boolean @default(true) mfaSecret String? inviteToken String? @unique inviteTokenExp DateTime? organizationId String? onboardingStatus String @default("PENDING_ONBOARDING") organization Organization? @relation(fields: [organizationId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt acceptances LegalAcceptance[] auditLogs AuditLog[] sharedAssets SharedAsset[] downloadRequests DownloadRequest[] } model Asset { id String @id @default(uuid()) title String type String size Int url String version Int @default(1) uploadedBy String description String? @db.Text categoryId String? subcategory String? tags String[] downloadsCount Int @default(0) githubUrl String? status String @default("published") isDownloadable Boolean @default(true) folderId String? folder Folder? @relation(fields: [folderId], references: [id], onDelete: SetNull) sharedWith SharedAsset[] downloadRequests DownloadRequest[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model SharedAsset { id String @id @default(uuid()) assetId String organizationId String userId String? createdAt DateTime @default(now()) asset Asset @relation(fields: [assetId], references: [id], onDelete: Cascade) organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade) user User? @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([assetId, organizationId, userId]) } model DownloadRequest { id String @id @default(uuid()) assetId String userId String status String @default("PENDING") // PENDING, APPROVED, REJECTED createdAt DateTime @default(now()) updatedAt DateTime @updatedAt asset Asset @relation(fields: [assetId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([assetId, userId]) } model Folder { id String @id @default(uuid()) name String parentId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt assets Asset[] } model LegalDocument { id String @id @default(uuid()) type DocumentType version String content String isActive Boolean @default(false) pdfUrl String? createdAt DateTime @default(now()) acceptances LegalAcceptance[] } model LegalAcceptance { id String @id @default(uuid()) docId String userId String ipAddress String signatureHash String? documentUrl String? signatureBase64 String? acceptedAt DateTime @default(now()) document LegalDocument @relation(fields: [docId], references: [id]) user User @relation(fields: [userId], references: [id]) } model AuditLog { id String @id @default(uuid()) actorId String action String resource String metadata Json? createdAt DateTime @default(now()) actor User @relation(fields: [actorId], references: [id]) } model BlogPost { id String @id @default(uuid()) title String content String @db.Text author String publishDate String thumbnailUrl String? readTime String? tags String[] status String @default("draft") // draft, published createdAt DateTime @default(now()) updatedAt DateTime @updatedAt }