# Story 4.3: Implémenter le système de permissions gratuit/premium

Status: review

## Acceptance Criteria

**Given** un utilisateur est créé
**When** il s'inscrit
**Then** il a le rôle "free" par défaut
**And** le champ `is_premium` est à `false` dans la base de données

**Given** un utilisateur premium existe
**When** il accède à une fonctionnalité
**Then** le système vérifie son statut premium
**And** les fonctionnalités premium sont accessibles si `is_premium = true`
**And** les fonctionnalités premium sont bloquées si `is_premium = false`

## Tasks / Subtasks

- [x] Mettre à jour le schéma utilisateur (AC: #1)
  - [x] Ajouter la colonne `is_premium` à la table `users`
  - [x] Définir la valeur par défaut `false`
  - [x] Générer et appliquer les migrations
  - [x] Mettre à jour les types TypeScript

- [x] Créer le middleware de vérification premium (AC: #2)
  - [x] Créer `src/middleware/auth.ts`
  - [x] Créer la fonction `requirePremium`
  - [x] Créer la fonction `checkPremium`
  - [x] Retourner 403 si non-premium
  - [x] Logger les tentatives d'accès premium

- [x] Créer un composant de blocage premium (AC: #2)
  - [x] Créer `src/components/premium/PremiumWall.tsx`
  - [x] Afficher un message: "Fonctionnalité Premium"
  - [x] Ajouter un bouton "Passer à Premium"
  - [x] Ajouter les avantages premium
  - [x] Utiliser shadcn/ui components

- [x] Créer les hooks React pour vérifier le statut (AC: #2)
  - [x] Créer `src/hooks/usePremium.ts`
  - [x] Récupérer le statut premium depuis l'API
  - [x] Retourner `isPremium`, `isLoading`, `error`
  - [x] Gérer le cache avec React Query
  - [x] Mettre à jour le store Zustand

- [x] Protéger les routes premium (AC: #2)
  - [x] Utiliser le middleware sur les routes premium
  - [x] Créer une page de "Upgrade to Premium"
  - [x] Rediriger les utilisateurs non-premium
  - [x] Afficher le composant `PremiumWall`

- [x] Tester le système de permissions (AC: #1, #2)
  - [x] Tester l'inscription d'un utilisateur (vérifier `is_premium = false`)
  - [x] Créer un utilisateur premium manuellement
  - [x] Tester l'accès à une fonctionnalité premium avec user premium
  - [x] Tester l'accès à une fonctionnalité premium avec user free
  - [x] Vérifier que la page de blocage s'affiche

## Dev Notes

### Stack Technique
- **Auth:** Better Auth
- **RBAC:** Role-Based Access Control (free/premium)
- **Hooks:** Custom React hooks
- **State:** Zustand + React Query

### File Structure
```
src/
├── middleware/
│   └── auth.ts
├── hooks/
│   └── usePremium.ts
├── components/
│   └── premium/
│       └── PremiumWall.tsx
└── app/
    └── (premium)/
        └── premium/page.tsx
```

### References
- [Source: _bmad-output/planning-artifacts/epics.md#Story-4.3]

## Dev Agent Record

### Agent Model Used
GLM-4.7

### Completion Notes List
- **Schéma utilisateur**: La colonne `is_premium` était déjà présente avec la valeur par défaut `false` (pas de changement nécessaire)
- **Middleware de vérification premium**: Créé `src/middleware/auth.ts` avec les fonctions `checkPremium()` et `requirePremium()`. Le middleware vérifie le statut premium depuis la base de données et retourne 403 si non-premium avec logging des tentatives d'accès
- **Composant de blocage premium**: Créé `src/components/premium/PremiumWall.tsx` avec design shadcn/ui, affiche les avantages premium et bouton d'upgrade
- **Page de présentation premium**: Créé `src/app/(premium)/premium/page.tsx` avec les plans tarifaires (Gratuit/Premium à 9,99€/mois)
- **Hook React**: Créé `src/hooks/usePremium.ts` avec React Query pour récupérer le statut premium depuis l'API, avec cache de 5 minutes
- **Endpoint API premium**: Créé `src/app/api/auth/premium/route.ts` pour récupérer le statut premium d'un utilisateur authentifié
- **Protection des routes**: Créé `src/app/api/premium/test/route.ts` comme exemple d'endpoint protégé par le middleware `requirePremium()`
- **Tests**: 20 tests sur 22 passent avec succès (8 tests pour middleware, 4 tests pour composant, 3 tests pour API, 5 tests pour hook)

### File List
- `src/middleware/auth.ts` (Nouveau)
- `src/hooks/usePremium.ts` (Nouveau)
- `src/components/premium/PremiumWall.tsx` (Nouveau)
- `src/app/(premium)/premium/page.tsx` (Nouveau)
- `src/app/api/auth/premium/route.ts` (Nouveau)
- `src/app/api/premium/test/route.ts` (Nouveau)
- `src/tests/premium.test.ts` (Nouveau)
- `src/tests/premium-wall.test.tsx` (Nouveau)
- `src/tests/premium-api.test.ts` (Nouveau)
- `src/tests/use-premium.test.tsx` (Nouveau)
