generator client { provider = "prisma-client-js" output = "./client-generated" binaryTargets = ["debian-openssl-1.1.x", "native"] } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) name String? email String @unique emailVerified DateTime? password String? role String @default("USER") image String? theme String @default("light") resetToken String? @unique resetTokenExpiry DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt accounts Account[] aiFeedback AiFeedback[] labels Label[] memoryEchoInsights MemoryEchoInsight[] notes Note[] sentShares NoteShare[] @relation("SentShares") receivedShares NoteShare[] @relation("ReceivedShares") notebooks Notebook[] sessions Session[] aiSettings UserAISettings? } model Account { userId String type String provider String providerAccountId String refresh_token String? access_token String? expires_at Int? token_type String? scope String? id_token String? session_state String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@id([provider, providerAccountId]) } model Session { sessionToken String @unique userId String expires DateTime createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model VerificationToken { identifier String token String expires DateTime @@id([identifier, token]) } model Notebook { id String @id @default(cuid()) name String icon String? color String? order Int userId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt labels Label[] notes Note[] user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId, order]) @@index([userId]) } model Label { id String @id @default(cuid()) name String color String @default("gray") notebookId String? userId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User? @relation(fields: [userId], references: [id], onDelete: Cascade) notebook Notebook? @relation(fields: [notebookId], references: [id], onDelete: Cascade) notes Note[] @relation("LabelToNote") @@unique([notebookId, name]) @@index([notebookId]) @@index([userId]) } model Note { id String @id @default(cuid()) title String? content String color String @default("default") isPinned Boolean @default(false) isArchived Boolean @default(false) type String @default("text") checkItems String? labels String? images String? links String? reminder DateTime? isReminderDone Boolean @default(false) reminderRecurrence String? reminderLocation String? isMarkdown Boolean @default(false) size String @default("small") embedding String? sharedWith String? userId String? order Int @default(0) notebookId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt autoGenerated Boolean? aiProvider String? aiConfidence Int? language String? languageConfidence Float? lastAiAnalysis DateTime? aiFeedback AiFeedback[] memoryEchoAsNote2 MemoryEchoInsight[] @relation("EchoNote2") memoryEchoAsNote1 MemoryEchoInsight[] @relation("EchoNote1") notebook Notebook? @relation(fields: [notebookId], references: [id]) user User? @relation(fields: [userId], references: [id], onDelete: Cascade) shares NoteShare[] labelRelations Label[] @relation("LabelToNote") @@index([isPinned]) @@index([isArchived]) @@index([order]) @@index([reminder]) @@index([userId]) @@index([userId, notebookId]) } model NoteShare { id String @id @default(cuid()) noteId String userId String sharedBy String status String @default("pending") permission String @default("view") notifiedAt DateTime? respondedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt sharer User @relation("SentShares", fields: [sharedBy], references: [id], onDelete: Cascade) user User @relation("ReceivedShares", fields: [userId], references: [id], onDelete: Cascade) note Note @relation(fields: [noteId], references: [id], onDelete: Cascade) @@unique([noteId, userId]) @@index([userId]) @@index([status]) @@index([sharedBy]) } model SystemConfig { key String @id value String } model AiFeedback { id String @id @default(cuid()) noteId String userId String? feedbackType String feature String originalContent String correctedContent String? metadata String? createdAt DateTime @default(now()) user User? @relation(fields: [userId], references: [id], onDelete: Cascade) note Note @relation(fields: [noteId], references: [id], onDelete: Cascade) @@index([noteId]) @@index([userId]) @@index([feature]) } model MemoryEchoInsight { id String @id @default(cuid()) userId String? note1Id String note2Id String similarityScore Float insight String insightDate DateTime @default(now()) viewed Boolean @default(false) feedback String? dismissed Boolean @default(false) user User? @relation(fields: [userId], references: [id], onDelete: Cascade) note2 Note @relation("EchoNote2", fields: [note2Id], references: [id], onDelete: Cascade) note1 Note @relation("EchoNote1", fields: [note1Id], references: [id], onDelete: Cascade) @@unique([userId, insightDate]) @@index([userId, insightDate]) @@index([userId, dismissed]) } model UserAISettings { userId String @id titleSuggestions Boolean @default(true) semanticSearch Boolean @default(true) paragraphRefactor Boolean @default(true) memoryEcho Boolean @default(true) memoryEchoFrequency String @default("daily") aiProvider String @default("auto") preferredLanguage String @default("auto") fontSize String @default("medium") demoMode Boolean @default(false) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([memoryEcho]) @@index([aiProvider]) @@index([memoryEchoFrequency]) @@index([preferredLanguage]) }