# 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
