Add notification bell system and MOPC onboarding form
Notification System: - Add InAppNotification and NotificationEmailSetting database models - Create notification service with 60+ notification types for all user roles - Add notification router with CRUD endpoints - Build NotificationBell UI component with dropdown and unread count - Integrate bell into admin, jury, mentor, and observer navs - Add notification email settings admin UI in Settings > Notifications - Add notification triggers to filtering router (complete/failed) - Add sendNotificationEmail function to email library - Add formatRelativeTime utility function MOPC Onboarding Form: - Create /apply landing page with auto-redirect for single form - Create seed script for MOPC 2026 application form (6 steps) - Create seed script for default notification email settings Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -278,6 +278,10 @@ model User {
|
||||
// Award overrides
|
||||
awardEligibilityOverrides AwardEligibility[] @relation("AwardEligibilityOverriddenBy")
|
||||
|
||||
// In-app notifications
|
||||
notifications InAppNotification[] @relation("UserNotifications")
|
||||
notificationSettingsUpdated NotificationEmailSetting[] @relation("NotificationSettingUpdater")
|
||||
|
||||
// NextAuth relations
|
||||
accounts Account[]
|
||||
sessions Session[]
|
||||
@@ -759,6 +763,55 @@ model NotificationLog {
|
||||
@@index([createdAt])
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// IN-APP NOTIFICATIONS
|
||||
// =============================================================================
|
||||
|
||||
model InAppNotification {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
type String // FILTERING_COMPLETE, NEW_APPLICATION, ASSIGNED_TO_PROJECT, etc.
|
||||
priority String @default("normal") // low, normal, high, urgent
|
||||
icon String? // lucide icon name
|
||||
title String
|
||||
message String @db.Text
|
||||
linkUrl String? // Where to navigate when clicked
|
||||
linkLabel String? // CTA text
|
||||
metadata Json? @db.JsonB // Extra context (projectId, roundId, etc.)
|
||||
groupKey String? // For batching similar notifications
|
||||
|
||||
isRead Boolean @default(false)
|
||||
readAt DateTime?
|
||||
expiresAt DateTime? // Auto-dismiss after date
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
// Relations
|
||||
user User @relation("UserNotifications", fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([userId, isRead])
|
||||
@@index([userId, createdAt])
|
||||
@@index([groupKey])
|
||||
}
|
||||
|
||||
model NotificationEmailSetting {
|
||||
id String @id @default(cuid())
|
||||
notificationType String @unique // e.g., "ADVANCED_TO_ROUND", "ASSIGNED_TO_PROJECT"
|
||||
category String // "team", "jury", "mentor", "admin"
|
||||
label String // Human-readable label for admin UI
|
||||
description String? // Help text
|
||||
sendEmail Boolean @default(true)
|
||||
emailSubject String? // Custom subject template (optional)
|
||||
emailTemplate String? @db.Text // Custom body template (optional)
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
updatedById String?
|
||||
updatedBy User? @relation("NotificationSettingUpdater", fields: [updatedById], references: [id])
|
||||
|
||||
@@index([category])
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// LEARNING HUB (Phase 2)
|
||||
// =============================================================================
|
||||
|
||||
Reference in New Issue
Block a user