Avery Felts 54b7a294f5 Add achievements, health timeline, savings tracker, and reminders features
- Achievements system with 6 badges and confetti celebration animation
- Health recovery timeline showing 9 milestones from 20min to 1 year
- Money savings tracker with cost configuration and goal progress
- Daily reminder notifications with browser permission handling
- New Prisma models: Achievement, ReminderSettings, SavingsConfig
- API routes for all new features
- Full dashboard integration with staggered animations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 11:38:46 -07:00

86 lines
2.2 KiB
Plaintext

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
model UserPreferences {
id String @id @default(cuid())
userId String @unique
substance String @default("nicotine")
trackingStartDate String?
hasCompletedSetup Boolean @default(false)
dailyGoal Int?
userName String?
userAge Int?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Quit plan fields stored as JSON string
quitPlanJson String?
usageEntries UsageEntry[]
achievements Achievement[]
reminderSettings ReminderSettings?
savingsConfig SavingsConfig?
}
model UsageEntry {
id String @id @default(cuid())
userId String
date String
count Int
substance String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userPreferences UserPreferences? @relation(fields: [userId], references: [userId])
@@unique([userId, date, substance])
}
model Achievement {
id String @id @default(cuid())
userId String
badgeId String
unlockedAt DateTime @default(now())
substance String
userPreferences UserPreferences? @relation(fields: [userId], references: [userId])
@@unique([userId, badgeId, substance])
}
model ReminderSettings {
id String @id @default(cuid())
userId String @unique
enabled Boolean @default(false)
reminderTime String @default("09:00")
lastNotifiedDate String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userPreferences UserPreferences? @relation(fields: [userId], references: [userId])
}
model SavingsConfig {
id String @id @default(cuid())
userId String @unique
costPerUnit Float
unitsPerDay Float
savingsGoal Float?
goalName String?
currency String @default("USD")
substance String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
userPreferences UserPreferences? @relation(fields: [userId], references: [userId])
}