generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") directUrl = env("DIRECT_URL") } model User { id String @id @default(cuid()) email String @unique passwordHash String? 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("simple") viewDays Int @default(7) fontSize String @default("M") goalFallbackType String @default("quote") goalDefaultSentence String @default("goal of the week") goalFontFamily String? @default("Lato") goalFontSize String? @default("1rem") goalFontWeight String? @default("500") headlineFont String @default("Oswald") headlineFontSize String? @default("1.5rem") 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") weekdayColor String? @default("#0ea5e9") dateColor String? @default("#888888") taskColor String? @default("#333333") todayHighlightColor String? @default("#f0fafa") weekendColorSat String? @default("#ffc107") weekendColorSun String? @default("#dc2626") pastDayColor String? @default("#a6a6a7") goalScope String @default("week") dateLayout String @default("right") mobileDateLayout String @default("below") dateAlignment String @default("center") dateVerticalAlign String? @default("middle") headerDisplay String? @default("kw") hourLabelFormat String @default("short") showSubHourSlots Boolean @default(true) allDayPosition String @default("above") cwColor String? @default("#333333") cwFontFamily String? @default("Oswald") cwFontSize String? @default("1.5rem") cwFontWeight String? @default("700") yearColor String? @default("#333333") yearFontFamily String? @default("Oswald") yearFontSize String? @default("1.5rem") yearFontWeight String? @default("700") showTaskCheckboxes Boolean @default(false) emailVerificationCode String? dayHeaderGap String? @default("0.75em") accountNumber Int @unique @default(autoincrement()) showCompletedTasks Boolean @default(true) showLines Boolean @default(true) weekdayFormat String? @default("long") weekdayCase String? @default("capitalize") customWeekdayNames String? @default("") startDayOffset Int @default(-1) quoteSourceUrls String[] @default([]) quoteLanguages String[] @default(["en", "de"]) kanbanStages String? accounts Account[] cachedCalendarEvents CachedCalendarEvent[] calendarConnections CalendarConnection[] projects Project[] sessions Session[] somedayLists SomedayList[] tasks Task[] weeklyGoals WeeklyGoal[] } model Account { id String @id @default(cuid()) 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? ext_expires_in Int? 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? completed Boolean @default(false) isRolling Boolean @default(false) order Int @default(0) dayOfWeek Int? scheduledDate DateTime? somedayListId String? originalDate DateTime? startTime String? endTime String? isRecurring Boolean @default(false) recurrenceInterval Int? recurrenceUnit String? recurrenceTime String? recurrenceEndDate DateTime? recurrenceDays String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt externalId String? externalProvider String? externalListId String? lastSyncedAt DateTime? deletedAt DateTime? parentTaskId String? somedaySlotIndex Int? projectId String? kanbanStage String? parent Task? @relation("SubTasks", fields: [parentTaskId], references: [id], onDelete: Cascade) subTasks Task[] @relation("SubTasks") project Project? @relation(fields: [projectId], references: [id]) somedayList SomedayList? @relation(fields: [somedayListId], references: [id]) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId, dayOfWeek]) @@index([userId, scheduledDate]) @@index([userId, somedayListId]) @@index([userId, externalId]) @@index([userId, deletedAt]) @@index([userId, projectId]) @@index([parentTaskId]) } model SomedayList { id String @id @default(cuid()) userId String title String order Int @default(0) tab String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt externalId String? externalProvider String? lastSyncedAt DateTime? 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? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt cachedEvents CachedCalendarEvent[] user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model CachedCalendarEvent { id String @id @default(cuid()) userId String externalId String connectionId String provider String calendarId String calendarTitle String calendarColor String? title String description String? location String? startDateTime DateTime? startDate String? endDateTime DateTime? endDate String? weekStart DateTime syncedAt DateTime @default(now()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt url String? recurringEventId String? isRecurring Boolean @default(false) connection CalendarConnection @relation(fields: [connectionId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, externalId, provider]) @@index([userId, startDateTime]) @@index([userId, startDate]) @@index([connectionId, weekStart]) } model WeeklyGoal { id String @id @default(cuid()) userId String weekStart DateTime text String @default("your goal of this week") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, weekStart]) @@index([userId]) } model Project { id String @id @default(cuid()) userId String name String icon String? color String? description 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]) }