# Story 9.1: Créer l'API publique avec documentation OpenAPI Status: review ## Acceptance Criteria **Given** l'API publique est implémentée **When** je consulte `/docs` (Swagger UI) **Then** je vois la documentation complète de l'API **And** tous les endpoints sont documentés avec exemples **And** je peux tester les endpoints directement depuis la documentation **Given** je fais une requête à l'API publique **When** j'utilise une clé API valide **Then** je reçois les données au format JSON **And** la réponse suit le format standardisé avec `data` et `meta` ## Tasks / Subtasks - [x] Créer l'endpoint `/api/public` (AC: #1) - [x] Créer `src/app/api/public/v1/` ou `backend/app/api/public/v1/` - [x] Créer `GET /api/public/v1/predictions` (public) - [x] Créer `GET /api/public/v1/matches` (public) - [x] Limiter les données publiques (pas de données sensibles) - [x] Documenter les endpoints - [x] Créer le système d'authentification par clé API (AC: #2) - [x] Créer `src/services/apiKeyService.ts` ou `backend/app/services/apiKeyService.py` - [x] Créer la table `api_keys` dans Drizzle/SQLAlchemy - [x] Créer la fonction `generateApiKey(userId)` - [x] Créer la fonction `validateApiKey(apiKey)` - [x] Implémenter le rate limiting différencié par clé API - [x] Configurer la documentation Swagger UI (AC: #1) - [x] Configurer FastAPI Swagger UI (`/docs`) - [x] Ajouter les descriptions détaillées des endpoints - [x] Ajouter les tags pour groupement logique - [x] Ajouter les exemples de requêtes/réponses - [x] Documenter les codes d'erreur (400, 401, 404, 500) - [x] Créer les schémas OpenAPI (AC: #1) - [x] Créer les schémas Pydantic pour les réponses - [x] Utiliser OpenAPI 3.1 - [x] Définir les formats standardisés (`{data, meta}` et `{error, meta}`) - [x] Documenter tous les types - [x] Générer la documentation automatique - [x] Créer l'endpoint `/openapi.json` (AC: #1) - [x] Créer `GET /openapi.json` pour exporter le schéma - [x] Permettre aux développeurs tiers de récupérer le schéma - [x] Valider que le schéma est complet - [x] Documenter l'endpoint - [x] Créer le dashboard pour développeurs (AC: #1) - [x] Créer `src/app/(developer)/dashboard/page.tsx` - [x] Afficher les statistiques d'utilisation de l'API - [x] Afficher la clé API de l'utilisateur - [x] Permettre de régénérer la clé API - [x] Afficher la documentation OpenAPI - [x] Créer les tests de l'API publique (AC: #1, #2) - [x] Tester les endpoints publics - [x] Tester la validation de clé API - [x] Tester le rate limiting - [x] Tester la documentation Swagger UI - [x] Tester le format des réponses - [x] Protéger l'API publique (AC: #1, #2) - [x] Configurer CORS pour autoriser les requêtes externes - [x] Configurer le rate limiting par clé API - [x] Désactiver `/docs` en production (ou protéger) - [x] Logger les requêtes d'API - [x] Monitorer l'utilisation ## Dev Notes ### Stack Technique - **API:** FastAPI avec OpenAPI 3.1 - **Documentation:** Swagger UI + Redoc - **Auth:** API Keys - **Rate Limiting:** Par clé API ### File Structure ``` backend/app/ ├── api/ │ ├── public/ │ │ └── v1/ │ │ ├── __init__.py │ │ ├── predictions.py │ │ └── matches.py ├── schemas/ │ └── public.py └── services/ └── apiKeyService.py ``` ### References - [Source: _bmad-output/planning-artifacts/epics.md#Story-9.1] ## Dev Agent Record ### Agent Model Used GLM-4.7 ### Completion Notes List - API publique créée avec succès - Documentation OpenAPI implémentée - Système de clés API fonctionnel - Swagger UI configurée et documentée - Rate limiting différencié implémenté - Dashboard développeur créé - Tests écrits pour l'API publique ### File List - `backend/app/api/public/__init__.py` - `backend/app/api/public/v1/__init__.py` - `backend/app/api/public/v1/predictions.py` - `backend/app/api/public/v1/matches.py` - `backend/app/schemas/public.py` - `backend/app/services/apiKeyService.py` - `backend/app/models/api_key.py` - `backend/app/api/dependencies.py` - `backend/app/middleware/__init__.py` - `backend/app/middleware/rate_limiter.py` - `backend/alembic/versions/20260118_0008_create_api_keys_table.py` - `backend/tests/test_public_api.py` - `backend/tests/test_api_key_service.py` - `backend/tests/test_api_dependencies.py` - `chartbastan/src/app/(developer)/dashboard/page.tsx` - `backend/app/main.py` (modifié pour inclure routes publiques et middleware) - `backend/app/models/user.py` (modifié pour ajouter relation api_keys) - `backend/app/models/__init__.py` (modifié pour exporter ApiKey)