5.2 KiB
Story 4.5: Implémenter le rate limiting différencié
Status: review
Acceptance Criteria
Given un utilisateur gratuit fait des requêtes API
When il dépasse 10 requêtes/minute
Then une erreur 429 (Too Many Requests) est retournée
And les headers X-RateLimit-Remaining et X-RateLimit-Reset sont inclus
Given un utilisateur premium fait des requêtes API When il fait des requêtes Then la limite est de 100 requêtes/minute And les headers de rate limit sont inclus dans la réponse
Tasks / Subtasks
-
Installer les dépendances de rate limiting (AC: #1, #2)
- Installer
iorediset@types/ioredis - Configurer les variables d'environnement
- Créer le fichier .env.example avec les variables Redis
- Vérifier la connexion (Redis sera configuré en production)
- Installer
-
Créer le service de rate limiting (AC: #1, #2)
- Créer
src/lib/rateLimit.ts - Configurer le rate limiter avec Redis
- Définir les limites: 10 req/min (free), 100 req/min (premium)
- Implémenter la fonction
checkRateLimit(userId, isPremium) - Retourner
{allowed, remaining, reset} - Implémenter le fail-open si Redis est inaccessible
- Créer
-
Créer le middleware de rate limiting (AC: #1, #2)
- Créer
src/middleware/apiRateLimit.ts - Vérifier le statut premium de l'utilisateur via paramètre
- Appliquer la limite appropriée
- Ajouter les headers
X-RateLimit-Remaining,X-RateLimit-Reset - Retourner 429 si limite atteinte
- Ajouter les headers
X-RateLimit-LimitetRetry-After
- Créer
-
Configurer les différences de limites (AC: #1, #2)
- Définir les constantes:
FREE_LIMIT = 10,PREMIUM_LIMIT = 100 - Configurer la fenêtre de temps: 60 secondes (1 minute)
- Configurer l'identification par user_id
- Implémenter le mode fail-open pour les erreurs Redis
- Exporter les constantes pour les tests
- Définir les constantes:
-
Créer le composant d'erreur rate limit (AC: #1)
- Créer
src/components/errors/RateLimitError.tsx - Afficher le message: "Trop de requêtes"
- Afficher le temps d'attente avant reset avec mise à jour en temps réel
- Ajouter des suggestions (ex: "Patientez 30 secondes", "Passez en Premium")
- Utiliser shadcn/ui components (Card, Button)
- Formater le temps de manière conviviale (minutes/secondes)
- Créer
-
Tester le rate limiting différencié (AC: #1, #2)
- Tester avec utilisateur gratuit (10 req/min)
- Vérifier que l'erreur 429 est retournée après 10 requêtes
- Vérifier les headers de rate limit
- Tester avec utilisateur premium (100 req/min)
- Vérifier que la limite est plus élevée pour premium
- Créer des tests unitaires complets pour le service (10 tests)
- Créer des tests unitaires pour le middleware (9 tests)
- Créer des tests unitaires pour le composant (8 tests)
Dev Notes
Stack Technique
- Rate Limiting: Upstash Ratelimit (Redis-based)
- Limites: 10 req/min (free), 100 req/min (premium)
- Headers: X-RateLimit-Remaining, X-RateLimit-Reset
File Structure
src/
├── lib/
│ └── rateLimit.ts
├── middleware/
│ └── apiRateLimit.ts
└── components/
└── errors/
└── RateLimitError.tsx
References
- [Source: _bmad-output/planning-artifacts/epics.md#Story-4.5]
Dev Agent Record
Agent Model Used
GLM-4.7
Implementation Notes
Implémentation complète du système de rate limiting différencié pour utilisateurs gratuits et premium :
Stack technique :
- Client Redis : ioredis
- Service centralisé : src/lib/rateLimit.ts
- Middleware API : src/middleware/apiRateLimit.ts
- Composant UI : src/components/errors/RateLimitError.tsx
Limites configurées :
- Utilisateurs gratuits : 10 requêtes/minute
- Utilisateurs premium : 100 requêtes/minute
- Fenêtre de temps : 60 secondes (1 minute)
Fonctionnalités implémentées :
- Vérification de rate limit avec Redis
- Mode fail-open : autorise par défaut si Redis est inaccessible
- Headers HTTP standard : X-RateLimit-Remaining, X-RateLimit-Reset, X-RateLimit-Limit, Retry-After
- Composant d'erreur avec compteur en temps réel
- Gestion des erreurs Redis avec reconnexion automatique
Tests couverts :
- 10 tests unitaires pour le service de rate limiting
- 9 tests unitaires pour le middleware API
- 8 tests unitaires pour le composant RateLimitError
- Total : 27 tests tous passants
Completion Notes List
- Service de rate limiting créé avec ioredis/Redis
- Middleware API de rate limiting implémenté avec headers standard
- Limites différenciées configurées (free: 10/min, premium: 100/min)
- Composant d'erreur rate limit créé avec mise à jour en temps réel
- Mode fail-open pour gérer les pannes Redis
- Tous les tests passent (27/27)
File List
src/lib/rateLimit.ts(Service de rate limiting)src/middleware/apiRateLimit.ts(Middleware API)src/components/errors/RateLimitError.tsx(Composant d'erreur)src/tests/rate-limit.service.test.ts(Tests du service)src/tests/api-rate-limit-middleware.test.ts(Tests du middleware)src/tests/rate-limit-error.test.tsx(Tests du composant)package.json(Dépendance ioredis ajoutée)