chartbastan/_bmad-output/implementation-artifacts/4-4-implémenter-la-gestion-des-limites-de-prédictions.md
2026-02-01 09:31:38 +01:00

6.2 KiB

Story 4.4: Implémenter la gestion des limites de prédictions

Status: review

Acceptance Criteria

Given un utilisateur gratuit consulte une prédiction When il accède à une prédiction Then le système vérifie son quota quotidien (1-2 prédictions/jour) And si le quota n'est pas dépassé, la prédiction est affichée And le compteur de prédictions consultées est incrémenté

Given un utilisateur gratuit a atteint sa limite When il tente de consulter une prédiction supplémentaire Then un message indique qu'il a atteint sa limite And une option pour passer à Premium est proposée And la prédiction n'est pas affichée

Given un utilisateur premium consulte des prédictions When il accède à des prédictions Then aucune limite n'est appliquée And toutes les prédictions sont accessibles

Tasks / Subtasks

  • Mettre à jour le schéma utilisateur pour le tracking des limites (AC: #1)

    • Ajouter la colonne daily_predictions_count à users
    • Ajouter la colonne last_prediction_date à users
    • Générer et appliquer les migrations
    • Mettre à jour les types TypeScript
  • Créer le service de vérification des limites (AC: #1)

    • Créer src/services/limitService.ts
    • Implémenter checkFreeUserLimit(userId)
    • Implémenter incrementDailyCount(userId)
    • Implémenter resetDailyCount() (cron ou à minuit)
    • Retourner allowed, remaining, limit
  • Créer le middleware de limitation (AC: #1, #2)

    • Créer src/middleware/rateLimit.ts
    • Vérifier le statut premium
    • Vérifier le quota quotidien pour les utilisateurs gratuits
    • Bloquer l'accès si limite atteinte
    • Retourner 429 si limite atteinte
  • Créer un composant de limite atteinte (AC: #2)

    • Créer src/components/limits/LimitReached.tsx
    • Afficher le message: "Limite de prédictions atteinte"
    • Afficher le compteur (ex: "1/2 prédictions utilisées")
    • Ajouter bouton "Passer à Premium"
    • Utiliser shadcn/ui components
  • Créer le composant de compteur de prédictions (AC: #1)

    • Créer src/components/limits/PredictionCounter.tsx
    • Afficher les prédictions restantes
    • Afficher le quota (ex: "1/2")
    • Mettre à jour en temps réel
    • Ne pas afficher pour les utilisateurs premium
  • Configurer le reset quotidien des limites (AC: #1)

    • Créer un cron job ou endpoint /api/limits/reset
    • Réinitialiser daily_predictions_count à 0
    • Mettre à jour last_prediction_date
    • Logger les resets
    • Tester le reset à minuit
  • Tester la gestion des limites (AC: #1, #2, #3)

    • Tester avec utilisateur gratuit (1-2 prédictions)
    • Tester quand la limite est atteinte
    • Tester avec utilisateur premium (illimité)
    • Vérifier que le reset quotidien fonctionne
    • Vérifier que le compteur est mis à jour

Dev Notes

Stack Technique

  • Limites: 1-2 prédictions/jour (free), illimité (premium)
  • Cron: Vercel Cron ou node-cron
  • State: Zustand + React Query

File Structure

src/
├── services/
│   └── limitService.ts
├── middleware/
│   └── rateLimit.ts
├── components/
│   └── limits/
│       ├── LimitReached.tsx
│       └── PredictionCounter.tsx
└── app/
    └── api/
        └── limits/
            └── reset/route.ts

References

  • [Source: _bmad-output/planning-artifacts/epics.md#Story-4.4]

Dev Agent Record

Agent Model Used

GLM-4.7

Completion Notes List

  • Schéma utilisateur mis à jour avec colonnes daily_predictions_count et last_prediction_date
  • Migration générée (0003_cheerful_true_believers.sql) et appliquée à la base de données
  • Types TypeScript automatiquement mis à jour par Drizzle ORM
  • Service de vérification des limites créé avec checkFreeUserLimit(), incrementDailyCount(), resetDailyCount()
  • Middleware de limitation implémenté avec vérification du statut premium et du quota quotidien
  • Composant LimitReached créé avec design shadcn/ui, affichage du compteur et bouton "Passer à Premium"
  • Composant PredictionCounter créé, affiche les prédictions restantes, ne s'affiche pas pour les utilisateurs premium
  • API endpoint /api/limits/reset créé pour réinitialiser les limites quotidiennes
  • Tests complets: 50 tests passants pour la gestion des limites (schéma, service, middleware, composants, API, intégration)

File List

  • src/db/schema.ts - Schéma utilisateur mis à jour avec daily_predictions_count et last_prediction_date
  • drizzle/migrations/0003_cheerful_true_believers.sql - Migration générée
  • src/services/limitService.ts - Service de vérification des limites
  • src/middleware/rateLimit.ts - Middleware de limitation des prédictions
  • src/components/limits/LimitReached.tsx - Composant de limite atteinte
  • src/components/limits/PredictionCounter.tsx - Composant de compteur de prédictions
  • src/app/api/limits/reset/route.ts - API endpoint pour reset quotidien
  • src/tests/limits-schema.test.ts - Tests du schéma (8 tests)
  • src/tests/limit-service-real.test.ts - Tests du service (8 tests)
  • src/tests/rate-limit-middleware.test.ts - Tests du middleware (6 tests)
  • src/tests/limit-reached.test.tsx - Tests du composant LimitReached (6 tests)
  • src/tests/prediction-counter.test.tsx - Tests du composant PredictionCounter (6 tests)
  • src/tests/limits-reset-api.test.ts - Tests de l'API reset (5 tests)
  • src/tests/limits-integration.test.ts - Tests d'intégration (11 tests)

Change Log

  • 2026-01-17: Implémentation complète de la gestion des limites de prédictions
    • Ajouté les colonnes daily_predictions_count et last_prediction_date au schéma utilisateur
    • Créé le service limitService.ts avec les fonctions checkFreeUserLimit, incrementDailyCount, resetDailyCount
    • Créé le middleware rateLimit.ts pour vérifier et bloquer les utilisateurs gratuits
    • Créé les composants LimitReached.tsx et PredictionCounter.tsx
    • Créé l'endpoint /api/limits/reset pour le reset quotidien
    • 50 tests d'unité et d'intégration écrits et passants
    • Tous les critères d'acceptation satisfaits
    • Aucune régression détectée