generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id @default(uuid()) email String @unique passwordHash String name String? theme String @default("light") fontSize String @default("medium") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt lastLoginAt DateTime? sessions Session[] bookmarks Bookmark[] notes Note[] chatMessages ChatMessage[] prayerRequests PrayerRequest[] readingHistory ReadingHistory[] preferences UserPreference[] } model Session { id String @id @default(uuid()) userId String token String @unique expiresAt DateTime createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) @@index([token]) } model BibleBook { id Int @id name String testament String orderNum Int chapters BibleChapter[] @@index([testament]) } model BibleChapter { id String @id @default(uuid()) bookId Int chapterNum Int verses BibleVerse[] book BibleBook @relation(fields: [bookId], references: [id]) @@unique([bookId, chapterNum]) @@index([bookId]) } model BibleVerse { id String @id @default(uuid()) chapterId String verseNum Int text String @db.Text version String @default("KJV") chapter BibleChapter @relation(fields: [chapterId], references: [id]) bookmarks Bookmark[] notes Note[] @@unique([chapterId, verseNum, version]) @@index([chapterId]) @@index([version]) } model ChatMessage { id String @id @default(uuid()) userId String role String // 'user' or 'assistant' content String @db.Text metadata Json? // Store verse references, etc. createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId, createdAt]) } model Bookmark { id String @id @default(uuid()) userId String verseId String note String? color String @default("#FFD700") createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) verse BibleVerse @relation(fields: [verseId], references: [id]) @@unique([userId, verseId]) @@index([userId]) } model Note { id String @id @default(uuid()) userId String verseId String content String @db.Text createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) verse BibleVerse @relation(fields: [verseId], references: [id]) @@index([userId]) @@index([verseId]) } model PrayerRequest { id String @id @default(uuid()) userId String? content String @db.Text isAnonymous Boolean @default(true) prayerCount Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User? @relation(fields: [userId], references: [id], onDelete: Cascade) prayers Prayer[] @@index([createdAt]) } model Prayer { id String @id @default(uuid()) requestId String ipAddress String // For anonymous prayer counting createdAt DateTime @default(now()) request PrayerRequest @relation(fields: [requestId], references: [id], onDelete: Cascade) @@unique([requestId, ipAddress]) } model ReadingHistory { id String @id @default(uuid()) userId String bookId Int chapterNum Int verseNum Int? viewedAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId, viewedAt]) } model UserPreference { id String @id @default(uuid()) userId String key String value String user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, key]) }