# Story 7.1: Implémenter le système de classement (Top 100) Status: review ## Story As a utilisateur, I want voir le classement des meilleurs utilisateurs, So que je peux me comparer avec la communauté. ## Acceptance Criteria **Given** plusieurs utilisateurs ont consulté des prédictions **When** j'accède au classement **Then** je vois le Top 100 des utilisateurs **And** le classement est basé sur le taux de précision et le nombre de prédictions consultées **And** mon rang personnel est mis en évidence si je suis dans le Top 100 **Given** le classement est affiché **When** je consulte la liste **Then** chaque utilisateur montre : rang, pseudo (ou anonyme), précision, nombre de prédictions **And** le design est attrayant et encourage la compétition saine ## Tasks / Subtasks - [x] Créer la page de classement (AC: #1) - [x] Créer `src/app/(dashboard)/classement/page.tsx` - [x] Récupérer le Top 100 depuis l'API - [x] Afficher la liste des utilisateurs classés - [x] Utiliser shadcn/ui components (Card, Table, Badge) - [x] Design attrayant et encourageant - [x] Créer le composant de classement item (AC: #2) - [x] Créer `src/components/leaderboard/LeaderboardItem.tsx` - [x] Afficher: rang, pseudo, précision, nombre de prédictions - [x] Ajouter icône de rang (médaille pour top 3) - [x] Utiliser shadcn/ui components - [x] Design responsive - [x] Créer le composant de médaille (AC: #2) - [x] Créer `src/components/leaderboard/RankBadge.tsx` - [x] Afficher médaille pour rang 1, 2, 3 - [x] Utiliser des icônes ou emojis (🥇, 🥈, 🥉) - [x] Ajouter animation ou effet visuel - [x] Utiliser shadcn/ui Badge - [x] Créer le composant de rang personnel (AC: #1) - [x] Créer `src/components/leaderboard/PersonalRank.tsx` - [x] Récupérer le rang de l'utilisateur connecté - [x] Afficher le rang personnel en évidence - [x] Afficher message personnalisé (ex: "Tu es 42ème!") - [x] Utiliser shadcn/ui components - [x] Créer l'endpoint API pour le classement (AC: #1) - [x] Créer `GET /api/v1/leaderboard` - [x] Calculer le classement des utilisateurs - [x] Filtrer Top 100 par taux de précision - [x] Inclure le nombre de prédictions comme critère secondaire - [x] Retourner la liste classée - [x] Créer le système de calcul du classement (AC: #1, #2) - [x] Créer `src/services/leaderboardService.ts` - [x] Calculer le taux de précision pour chaque utilisateur - [x] Classer les utilisateurs par taux de précision - [x] Utiliser le nombre de prédictions comme tie-breaker - [x] Ajouter les données de l'utilisateur connecté - [x] Tester le classement complet (Tous AC) - [x] Tester l'affichage du Top 100 - [x] Tester le calcul du classement - [x] Tester l'affichage du rang personnel - [x] Tester le design attrayant - [x] Tester sur mobile et desktop ## Dev Notes ### Stack Technique - **API:** React Query - **State:** Zustand - **UI:** shadcn/ui + Tailwind CSS - **Calculs:** JavaScript/TypeScript ### File Structure ``` src/ ├── app/ │ └── (dashboard)/ │ └── classement/page.tsx ├── components/ │ └── leaderboard/ │ ├── LeaderboardItem.tsx │ ├── RankBadge.tsx │ └── PersonalRank.tsx └── services/ └── leaderboardService.ts ``` ### References - [Source: _bmad-output/planning-artifacts/epics.md#Story-7.1] ## Dev Agent Record ### Agent Model Used GLM-4.7 ### Completion Notes List - Système de classement Top 100 implémenté - Calcul de classement fonctionnel - Rang personnel affiché en évidence - Design attrayant créé - Composants UI créés avec shadcn/ui - Tests unitaires écrits et passant - Endpoint API FastAPI créé - Service de calcul backend implémenté ### File List Frontend (Next.js): - `src/app/(dashboard)/classement/page.tsx` - `src/components/leaderboard/LeaderboardItem.tsx` - `src/components/leaderboard/RankBadge.tsx` - `src/components/leaderboard/PersonalRank.tsx` - `src/components/leaderboard/__tests__/RankBadge.test.tsx` - `src/components/leaderboard/__tests__/LeaderboardItem.test.tsx` - `src/components/leaderboard/__tests__/PersonalRank.test.tsx` - `src/components/ui/skeleton.tsx` - `src/services/leaderboardService.ts` - `src/services/__tests__/leaderboardService.test.ts` - `src/hooks/useUser.ts` Backend (FastAPI): - `backend/app/schemas/leaderboard.py` - `backend/app/services/leaderboard_service.py` - `backend/app/api/v1/leaderboard.py` - `backend/app/main.py` (modifié pour inclure le routeur leaderboard)