@@ -19,6 +19,9 @@ model User {
1919 completions Completion []
2020 credentials Credential []
2121 transactions Transaction []
22+ deviceTokens DeviceToken []
23+ notificationPref NotificationPreference ?
24+ notifications NotificationLog []
2225 syncEvents SyncEvent []
2326 referralCode ReferralCode ?
2427 referrals Referral [] @relation (" Referrer " )
@@ -161,3 +164,40 @@ model WebhookDelivery {
161164 lastAttemptAt DateTime ?
162165 createdAt DateTime @default (now () )
163166}
167+
168+ model DeviceToken {
169+ id String @id @default (uuid () )
170+ userId String
171+ user User @relation (fields : [userId ] , references : [id ] , onDelete : Cascade )
172+ token String @unique
173+ platform String // "ios", "android", "web"
174+ createdAt DateTime @default (now () )
175+ updatedAt DateTime @updatedAt
176+ }
177+
178+ model NotificationPreference {
179+ id String @id @default (uuid () )
180+ userId String @unique
181+ user User @relation (fields : [userId ] , references : [id ] , onDelete : Cascade )
182+ rewardReceipt Boolean @default (true )
183+ quizPassFail Boolean @default (true )
184+ streakReminders Boolean @default (true )
185+ createdAt DateTime @default (now () )
186+ updatedAt DateTime @updatedAt
187+ }
188+
189+ model NotificationLog {
190+ id String @id @default (uuid () )
191+ userId String
192+ user User @relation (fields : [userId ] , references : [id ] , onDelete : Cascade )
193+ type String // "reward", "quiz", "streak"
194+ title String
195+ body String
196+ status String @default (" pending " ) // pending, sent, failed, dead-letter
197+ error String ?
198+ attemptCount Int @default (0 )
199+ maxAttempts Int @default (5 )
200+ nextAttemptAt DateTime ? @default (now () )
201+ createdAt DateTime @default (now () )
202+ updatedAt DateTime @updatedAt
203+ }
0 commit comments