# Story 8.3: Implémenter la gestion des préférences de notifications Status: review ## Acceptance Criteria **Given** je suis dans les paramètres **When** j'accède aux préférences de notifications **Then** je peux activer/désactiver : changements majeurs, confirmations, alertes premium **And** mes préférences sont sauvegardées **And** les notifications respectent mes préférences ## Tasks / Subtasks - [x] Créer la page de préférences de notifications (AC: #1) - [x] Créer `src/app/(dashboard)/profil/notifications/page.tsx` - [x] Afficher les catégories de notifications - [x] Afficher les switches pour activer/désactiver - [x] Utiliser shadcn/ui components (Card, Switch, Label) - [x] Design responsive et moderne - [x] Créer le système de préférences dans la base de données (AC: #1) - [x] Mettre à jour la table `notification_preferences` - [x] Ajouter colonnes: major_changes_enabled, confirmations_enabled, premium_alerts_enabled - [x] Générer et appliquer les migrations - [x] Créer les modèles Drizzle correspondants - [ ] Créer les schémas Pydantic (Backend FastAPI - non requis pour cette story) - [x] Créer le service de gestion des préférences (AC: #1) - [x] Créer `src/services/notificationPreferenceService.ts` - [x] Créer la fonction `updatePreferences(userId, preferences)` - [x] Créer la fonction `getPreferences(userId)` - [x] Valider les préférences - [x] Sauvegarder dans la base de données - [x] Créer les switches de préférences (AC: #1) - [x] Créer `src/components/notifications/NotificationSwitch.tsx` - [x] Créer un switch pour chaque type de notification - [x] Inclure des descriptions explicatives - [x] Utiliser shadcn/ui Switch component - [x] Gérer l'état de chargement - [x] Créer l'endpoint API pour les préférences (AC: #1) - [x] Créer `GET /api/v1/notifications/preferences` - [x] Créer `POST /api/v1/notifications/preferences` - [ ] Valider les entrées avec Pydantic (Backend FastAPI - non requis pour cette story) - [x] Retourner les préférences actuelles - [x] Mettre à jour les préférences - [ ] Documenter avec Swagger (Backend FastAPI - non requis pour cette story) - [x] Intégrer les préférences avec le système de notifications (AC: #2) - [x] Vérifier les préférences avant d'envoyer des notifications - [x] Respecter les préférences de l'utilisateur - [x] Ne pas envoyer les notifications désactivées - [x] Logger les préférences respectées - [x] Tester le système de préférences (Tous AC) - [x] Tester l'activation/désactivation des notifications - [x] Tester que les notifications respectent les préférences - [x] Tester la sauvegarde des préférences - [x] Tester la récupération des préférences - [x] Tester l'endpoint API ## Dev Notes ### Stack Technique - **Database:** Drizzle + SQLite - **API:** Next.js API routes - **UI:** shadcn/ui + Tailwind CSS - **Validation:** Pydantic ### File Structure ``` src/ ├── app/ │ └── (dashboard)/ │ └── profil/ │ └── notifications/page.tsx ├── components/ │ └── notifications/ │ └── NotificationSwitch.tsx └── services/ └── notificationPreferenceService.ts ``` ### References - [Source: _bmad-output/planning-artifacts/epics.md#Story-8.3] ## Dev Agent Record ### Agent Model Used GLM-4.7 ### Completion Notes List - **Page de préférences de notifications créée** (`/profil/notifications/page.tsx`) - Interface moderne et responsive avec shadcn/ui - Gestion des trois types de notifications : changements majeurs, confirmations, alertes premium - Switch individuels avec descriptions explicatives - État de chargement et feedback utilisateur - Gestion des erreurs et messages de confirmation - **Base de données mise à jour** avec trois nouvelles colonnes : - `major_changes_enabled` : alertes changements d'énergie (>10% en 30 min) - `confirmations_enabled` : notifications de prédiction confirmée - `premium_alerts_enabled` : offres et fonctionnalités premium - Migration créée et appliquée (`0010_brave_gambit.sql`) - **Service de gestion des préférences créé** (`notificationPreferenceService.ts`) - Fonctions : getPreferences(), updatePreferences(), togglePushNotifications(), toggleNotificationType() - Validation des préférences (types, cohérence) - Support des valeurs par défaut - 18 tests unitaires passés - **Composant NotificationSwitch créé** avec fonctionnalités avancées : - Switch réutilisable pour chaque type de notification - Indicateurs visuels (icônes, catégories, badge "Activé") - Gestion de l'état de chargement - Désactivation automatique quand push est désactivé - **Endpoint API mis à jour** pour supporter les nouvelles colonnes - GET /api/v1/notifications/preferences : récupérer les préférences - POST /api/v1/notifications/preferences : mettre à jour les préférences - Support legacy pour `types_enabled` (compatibilité arrière) - Validation et gestion des erreurs - **Intégration avec le système de notifications** : - Mise à jour de `notificationService.ts` pour vérifier les nouvelles préférences - Méthode `isNotificationTypeEnabled()` enrichie - Support legacy et nouvelle structure en parallèle - **Tests unitaires créés** : - 18 tests pour `notificationPreferenceService.ts` ✓ - Tests pour la page de préférences ✓ - Tests pour le composant NotificationSwitch ✓ - **Navigation mise à jour** : ajout du lien "Notifications" dans la page de profil ### Change Log - 2026-01-18: Implémentation complète du système de gestion des préférences de notifications - Page UI créée avec design moderne - Base de données mise à jour avec 3 nouvelles colonnes - Service de gestion des préférences avec validation - Composant NotificationSwitch réutilisable - Endpoint API mis à jour pour supporter les nouvelles préférences - Intégration avec le système de notifications existant - 18 tests unitaires créés et passés - Navigation vers la page de notifications ajoutée ### File List #### Frontend (Next.js) - `src/app/(dashboard)/profil/notifications/page.tsx` - Page de gestion des préférences - `src/app/(dashboard)/profil/page.tsx` - Mise à jour : ajout lien Notifications - `src/components/notifications/NotificationSwitch.tsx` - Composant switch réutilisable - `src/services/notificationPreferenceService.ts` - Service de gestion des préférences - `src/services/notificationService.ts` - Mise à jour : intégration nouvelles préférences - `src/db/schema.ts` - Mise à jour : ajout colonnes majorChangesEnabled, confirmationsEnabled, premiumAlertsEnabled - `src/app/api/v1/notifications/preferences/route.ts` - Mise à jour : support nouvelles colonnes #### Tests - `src/services/notificationPreferenceService.test.ts` - Tests du service (18 tests) - `src/components/notifications/NotificationSwitch.test.tsx` - Tests du composant - `src/app/(dashboard)/profil/notifications/page.test.tsx` - Tests de la page #### Base de données - `drizzle/migrations/0010_brave_gambit.sql` - Migration pour les nouvelles colonnes