generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) email String @unique passwordHash String? // Optional for SSO users name String? image String? emailVerified DateTime? verifiedAt DateTime? emailVerificationToken String? emailVerificationExpires DateTime? passwordResetToken String? passwordResetExpires DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt timezone String @default("UTC") autoRolling Boolean @default(false) protectEventTimes Boolean @default(false) language String @default("de") dateFormat String @default("yyyy-MM-dd") timeFormat String @default("24h") startHour Int @default(8) endHour Int @default(18) showNextTask Boolean @default(false) calendarEditMode Boolean @default(false) focusTimerDuration Int @default(25) focusBreakDuration Int @default(5) showTimeGrid Boolean @default(true) showSomeday Boolean @default(true) showAllDayEvents Boolean @default(true) showSchedule Boolean @default(true) cellDuration Int @default(30) viewStyle String @default("grid") viewDays Int @default(7) fontSize String @default("M") // "S", "M", "L" headlineFont String @default("Inter") headlineFontSize String? @default("1.25rem") headlineFontWeight String? @default("900") dateFontFamily String? @default("Inter") dateFontSize String? @default("0.65rem") dateFontWeight String? @default("400") timeTaskFontFamily String? @default("Inter") timeTaskFontSize String? @default("0.75rem") timeTaskFontWeight String? @default("500") bodyFont String @default("Inter") taskFontFamily String? @default("Inter") taskFontSize String? @default("0.9rem") taskFontWeight String? @default("400") eventFontFamily String? @default("Inter") eventFontSize String? @default("0.85rem") eventFontWeight String? @default("400") fontWeight String @default("400") // Legacy/Generic // Color Settings weekdayColor String? @default("#888888") dateColor String? @default("#888888") taskColor String? @default("#333333") todayHighlightColor String? @default("#f0fafa") weekendColorSat String? @default("#666666") weekendColorSun String? @default("#dc2626") pastDayColor String? @default("#a6a6a7") accounts Account[] sessions Session[] tasks Task[] somedayLists SomedayList[] calendarConnections CalendarConnection[] } model Account { id String @id @default(cuid()) userId String type String provider String providerAccountId String refresh_token String? @db.Text access_token String? @db.Text expires_at Int? token_type String? scope String? id_token String? @db.Text session_state String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) } model Session { id String @id @default(cuid()) sessionToken String @unique userId String expires DateTime user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model VerificationToken { identifier String token String @unique expires DateTime @@unique([identifier, token]) } model Task { id String @id @default(cuid()) userId String title String description String? markdownContent String? @db.Text completed Boolean @default(false) isRolling Boolean @default(false) order Int @default(0) dayOfWeek Int? // 0-6 for Sunday-Saturday (legacy/someday lists) scheduledDate DateTime? // Actual date for the task somedayListId String? originalDate DateTime? startTime String? endTime String? isRecurring Boolean @default(false) recurrenceInterval Int? // Number of units between occurrences recurrenceUnit String? // "days" or "weeks" recurrenceTime String? // e.g. "09:00" - time for the recurring task recurrenceEndDate DateTime? // Optional end date for recurrence createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) somedayList SomedayList? @relation(fields: [somedayListId], references: [id]) @@index([userId, dayOfWeek]) @@index([userId, scheduledDate]) @@index([userId, somedayListId]) } model SomedayList { id String @id @default(cuid()) userId String title String order Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) tasks Task[] @@index([userId]) } model CalendarConnection { id String @id @default(cuid()) userId String provider String accessToken String refreshToken String? expiresAt DateTime? calendars Json? // Stores array of { id, title, isPrimary, selected } createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) }