134 lines
4.7 KiB
Markdown
134 lines
4.7 KiB
Markdown
# 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)
|