Add initial project
This commit is contained in:
@@ -0,0 +1,829 @@
|
||||
# Plan de Correction - HabitForge
|
||||
|
||||
**Date:** 2025-12-30
|
||||
**Basé sur:** `revue_critique_habitforge.md`
|
||||
**Objectif:** Transformer HabitForge en une application professionnelle et production-ready
|
||||
|
||||
---
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Ce plan organise les corrections nécessaires en 5 phases prioritaires, des problèmes critiques de sécurité jusqu'aux améliorations de l'expérience utilisateur.
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Phase 1: Sécurité & Stabilité] --> B[Phase 2: Architecture & Qualité]
|
||||
B --> C[Phase 3: Tests & CI/CD]
|
||||
C --> D[Phase 4: Observabilité & Performance]
|
||||
D --> E[Phase 5: UX & Documentation]
|
||||
|
||||
A --> A1[Configuration env vars]
|
||||
A --> A2[Secrets management]
|
||||
A --> A3[CORS & Rate limiting]
|
||||
A --> A4[PostgreSQL migration]
|
||||
A --> A5[HTTPS & Nginx]
|
||||
|
||||
B --> B1[Restructuration backend]
|
||||
B --> B2[Couche de services]
|
||||
B --> B3[Modularisation frontend]
|
||||
B --> B4[DX tools]
|
||||
|
||||
C --> C1[Tests unitaires]
|
||||
C --> C2[Tests intégration]
|
||||
C --> C3[GitHub Actions CI/CD]
|
||||
|
||||
D --> D1[Logging structuré]
|
||||
D --> D2[Health checks]
|
||||
D --> D3[Performance DB]
|
||||
|
||||
E --> E1[Notifications UI]
|
||||
E --> E2[Documentation]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Sécurité & Stabilité (Critique)
|
||||
|
||||
### 1.1 Configuration et Environment Variables
|
||||
|
||||
**Objectif:** Éliminer toute configuration hardcodée et sécuriser les secrets.
|
||||
|
||||
#### Étape 1.1.1: Créer le module de configuration
|
||||
- [x] Créer `backend/core/config.py` avec `pydantic_settings`
|
||||
- [x] Définir la classe `Settings` avec tous les paramètres
|
||||
- [x] Configurer le chargement depuis `.env`
|
||||
- [x] Générer `SECRET_KEY` avec `token_urlsafe(32)` par défaut
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `backend/core/config.py` (nouveau)
|
||||
- `backend/core/__init__.py` (nouveau)
|
||||
|
||||
#### Étape 1.1.2: Créer les fichiers d'environnement
|
||||
- [x] Créer `.env.example` avec tous les paramètres documentés
|
||||
- [x] Créer `.env.development` (gitignored)
|
||||
- [ ] Créer `.env.staging` (gitignored)
|
||||
- [ ] Créer `.env.production` (gitignored)
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `.env.example`
|
||||
- `.env.development`
|
||||
- `.env.staging`
|
||||
- `.env.production`
|
||||
|
||||
#### Étape 1.1.3: Mettre à jour .gitignore
|
||||
- [ ] Ajouter `.env*` (sauf `.env.example`)
|
||||
- [ ] Ajouter `backend/client_secret*.json`
|
||||
- [ ] Ajouter `data/*.db`
|
||||
- [ ] Ajouter `__pycache__/`, `*.pyc`, `.pytest_cache/`
|
||||
- [ ] Ajouter `.coverage`, `htmlcov/`
|
||||
- [ ] Ajouter `node_modules/`, `.DS_Store`
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `.gitignore`
|
||||
|
||||
#### Étape 1.1.4: Migrer le code vers la configuration centralisée
|
||||
- [x] Modifier `backend/auth.py` pour utiliser `settings.SECRET_KEY`
|
||||
- [x] Modifier `backend/main.py` pour utiliser `settings.CORS_ORIGINS`
|
||||
- [x] Modifier `backend/database.py` pour utiliser `settings.DATABASE_URL`
|
||||
- [x] Modifier `backend/google_fit.py` pour utiliser les env vars Google
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `backend/auth.py`
|
||||
- `backend/main.py`
|
||||
- `backend/database.py`
|
||||
- `backend/google_fit.py`
|
||||
|
||||
---
|
||||
|
||||
### 1.2 Sécurité des Secrets
|
||||
|
||||
**Objectif:** Supprimer tous les secrets hardcodés du code.
|
||||
|
||||
#### Étape 1.2.1: Nettoyer les secrets Google
|
||||
- [x] Supprimer `backend/client_secret_947199050300-boi4r9r8eekmv61h748lrvjmvp1f2v38.apps.googleusercontent.com.json`
|
||||
- [x] Supprimer `backend/client_secret.json` du git
|
||||
- [ ] Documenter la configuration des credentials Google dans `.env.example`
|
||||
|
||||
**Fichiers à supprimer:**
|
||||
- `backend/client_secret_947199050300-boi4r9r8eekmv61h748lrvjmvp1f2v38.apps.googleusercontent.com.json`
|
||||
- `backend/client_secret.json`
|
||||
|
||||
#### Étape 1.2.2: Supprimer le SECRET_KEY hardcodé
|
||||
- [x] Remplacer `"supersecretkey_change_me_in_production"` dans `backend/auth.py`
|
||||
- [x] Utiliser `settings.SECRET_KEY` à la place
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `backend/auth.py`
|
||||
|
||||
---
|
||||
|
||||
### 1.3 CORS et Rate Limiting
|
||||
|
||||
**Objectif:** Sécuriser les accès API et prévenir les attaques DoS.
|
||||
|
||||
#### Étape 1.3.1: Configurer CORS sécurisé
|
||||
- [x] Modifier `backend/main.py` pour utiliser `settings.CORS_ORIGINS`
|
||||
- [x] Supprimer `allow_origins=["*"]`
|
||||
- [x] Configurer `allow_credentials=True`
|
||||
- [x] Configurer `allow_methods` et `allow_headers` explicites
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `backend/main.py`
|
||||
|
||||
#### Étape 1.3.2: Ajouter rate limiting
|
||||
- [x] Installer `slowapi`
|
||||
- [x] Configurer `Limiter` dans `backend/main.py`
|
||||
- [ ] Ajouter rate limit sur les endpoints d'authentification
|
||||
- [ ] Ajouter rate limit sur les endpoints de création/modification
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `requirements.txt`
|
||||
- `backend/main.py`
|
||||
|
||||
---
|
||||
|
||||
### 1.4 Migration PostgreSQL
|
||||
|
||||
**Objectif:** Remplacer SQLite par PostgreSQL pour la production.
|
||||
|
||||
#### Étape 1.4.1: Préparer la migration
|
||||
- [ ] Installer `psycopg2-binary` dans `requirements.txt`
|
||||
- [ ] Créer un script de migration des données SQLite vers PostgreSQL
|
||||
- [ ] Documenter le processus de migration
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `requirements.txt`
|
||||
- `scripts/migrate_to_postgres.py` (nouveau)
|
||||
|
||||
#### Étape 1.4.2: Configurer PostgreSQL
|
||||
- [ ] Mettre à jour `docker-compose.yml` pour PostgreSQL
|
||||
- [ ] Créer `docker-compose.dev.yml` pour développement
|
||||
- [ ] Créer `docker-compose.prod.yml` pour production
|
||||
- [ ] Configurer les volumes persistants
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `docker-compose.yml`
|
||||
- `docker-compose.dev.yml` (nouveau)
|
||||
- `docker-compose.prod.yml` (nouveau)
|
||||
|
||||
#### Étape 1.4.3: Exécuter la migration
|
||||
- [ ] Sauvegarder les données SQLite existantes
|
||||
- [ ] Exécuter le script de migration
|
||||
- [ ] Vérifier l'intégrité des données
|
||||
- [ ] Mettre à jour les migrations Alembic si nécessaire
|
||||
|
||||
---
|
||||
|
||||
### 1.5 HTTPS et Reverse Proxy
|
||||
|
||||
**Objectif:** Sécuriser les communications en production.
|
||||
|
||||
#### Étape 1.5.1: Configurer Nginx
|
||||
- [ ] Créer `nginx/nginx.conf`
|
||||
- [ ] Configurer SSL/TLS avec Let's Encrypt
|
||||
- [ ] Configurer le reverse proxy vers FastAPI
|
||||
- [ ] Servir les fichiers statiques via Nginx
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `nginx/nginx.conf` (nouveau)
|
||||
- `nginx/Dockerfile` (nouveau)
|
||||
|
||||
#### Étape 1.5.2: Configurer Gunicorn
|
||||
- [ ] Installer `gunicorn` dans `requirements.txt`
|
||||
- [ ] Créer un script de démarrage avec Gunicorn
|
||||
- [ ] Configurer le nombre de workers
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `requirements.txt`
|
||||
- `scripts/start_prod.sh` (nouveau)
|
||||
|
||||
#### Étape 1.5.3: Mettre à jour Docker Compose
|
||||
- [ ] Ajouter le service Nginx dans `docker-compose.prod.yml`
|
||||
- [ ] Configurer les réseaux Docker
|
||||
- [ ] Configurer les health checks
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `docker-compose.prod.yml`
|
||||
|
||||
---
|
||||
|
||||
### 1.6 Backups de Base de Données
|
||||
|
||||
**Objectif:** Automatiser les sauvegardes de la base de données.
|
||||
|
||||
#### Étape 1.6.1: Créer le script de backup
|
||||
- [ ] Créer `scripts/backup_db.sh`
|
||||
- [ ] Configurer la rotation des backups
|
||||
- [ ] Compresser les backups
|
||||
- [ ] Envoyer les backups vers un stockage externe (optionnel)
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `scripts/backup_db.sh` (nouveau)
|
||||
|
||||
#### Étape 1.6.2: Automatiser les backups
|
||||
- [ ] Configurer un cron job dans Docker
|
||||
- [ ] Documenter la procédure de restauration
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `docker-compose.prod.yml`
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Architecture & Qualité
|
||||
|
||||
### 2.1 Restructuration du Backend
|
||||
|
||||
**Objectif:** Organiser le code backend selon les principes de Clean Architecture.
|
||||
|
||||
#### Étape 2.1.1: Créer la nouvelle structure de dossiers
|
||||
- [x] Créer `backend/api/v1/` pour les routes
|
||||
- [x] Créer `backend/core/` pour la configuration et sécurité
|
||||
- [x] Créer `backend/models/` pour les SQLAlchemy models
|
||||
- [x] Créer `backend/schemas/` pour les Pydantic schemas
|
||||
- [x] Créer `backend/services/` pour la logique métier
|
||||
- [x] Créer `backend/repositories/` pour l'accès aux données
|
||||
- [x] Créer `backend/integrations/` pour les APIs externes
|
||||
|
||||
**Dossiers à créer:**
|
||||
- `backend/api/v1/`
|
||||
- `backend/core/`
|
||||
- `backend/models/`
|
||||
- `backend/schemas/`
|
||||
- `backend/services/`
|
||||
- `backend/repositories/`
|
||||
- `backend/integrations/`
|
||||
|
||||
#### Étape 2.1.2: Extraire les routes
|
||||
- [x] Créer `backend/api/v1/auth.py` avec les endpoints d'auth
|
||||
- [x] Créer `backend/api/v1/challenges.py` avec les endpoints challenges
|
||||
- [x] Créer `backend/api/v1/health.py` avec le health check
|
||||
- [x] Créer `backend/api/v1/__init__.py` pour l'agrégation
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `backend/api/v1/auth.py`
|
||||
- `backend/api/v1/challenges.py`
|
||||
- `backend/api/v1/health.py`
|
||||
- `backend/api/v1/__init__.py`
|
||||
|
||||
#### Étape 2.1.3: Séparer models et schemas
|
||||
- [x] Déplacer les SQLAlchemy models vers `backend/models/`
|
||||
- [x] Créer `backend/models/__init__.py`
|
||||
- [x] Extraire les Pydantic schemas vers `backend/schemas/`
|
||||
- [x] Créer `backend/schemas/__init__.py`
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `backend/models/user.py`
|
||||
- `backend/models/challenge.py`
|
||||
- `backend/models/tracking.py`
|
||||
- `backend/models/__init__.py`
|
||||
- `backend/schemas/user.py`
|
||||
- `backend/schemas/challenge.py`
|
||||
- `backend/schemas/tracking.py`
|
||||
- `backend/schemas/__init__.py`
|
||||
|
||||
#### Étape 2.1.4: Créer la couche de services
|
||||
- [ ] Créer `backend/services/auth_service.py`
|
||||
- [ ] Créer `backend/services/challenge_service.py`
|
||||
- [ ] Créer `backend/services/health_service.py`
|
||||
- [ ] Créer `backend/services/__init__.py`
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `backend/services/auth_service.py`
|
||||
- `backend/services/challenge_service.py`
|
||||
- `backend/services/health_service.py`
|
||||
- `backend/services/__init__.py`
|
||||
|
||||
#### Étape 2.1.5: Créer la couche de repositories
|
||||
- [ ] Créer `backend/repositories/base.py` avec le repository de base
|
||||
- [ ] Créer `backend/repositories/user_repository.py`
|
||||
- [ ] Créer `backend/repositories/challenge_repository.py`
|
||||
- [ ] Créer `backend/repositories/__init__.py`
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `backend/repositories/base.py`
|
||||
- `backend/repositories/user_repository.py`
|
||||
- `backend/repositories/challenge_repository.py`
|
||||
- `backend/repositories/__init__.py`
|
||||
|
||||
#### Étape 2.1.6: Déplacer les intégrations
|
||||
- [x] Déplacer `backend/google_fit.py` vers `backend/integrations/`
|
||||
- [x] Déplacer `backend/import_zepp.py` vers `backend/integrations/`
|
||||
- [x] Créer `backend/integrations/__init__.py`
|
||||
|
||||
**Fichiers à déplacer/créer:**
|
||||
- `backend/integrations/google_fit.py`
|
||||
- `backend/integrations/import_zepp.py`
|
||||
- `backend/integrations/__init__.py`
|
||||
|
||||
#### Étape 2.1.7: Créer les modules core
|
||||
- [ ] Créer `backend/core/security.py` avec les fonctions de sécurité
|
||||
- [ ] Créer `backend/core/deps.py` avec les dépendances FastAPI
|
||||
- [x] Créer `backend/core/__init__.py`
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `backend/core/security.py`
|
||||
- `backend/core/deps.py`
|
||||
- `backend/core/__init__.py`
|
||||
|
||||
#### Étape 2.1.8: Simplifier main.py
|
||||
- [ ] Nettoyer `backend/main.py` pour ne contenir que l'initialisation
|
||||
- [ ] Supprimer `models.Base.metadata.create_all(bind=database.engine)`
|
||||
- [ ] Enregistrer les routers depuis `api/v1/`
|
||||
- [ ] Configurer le middleware de gestion d'erreurs
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `backend/main.py`
|
||||
|
||||
---
|
||||
|
||||
### 2.2 Modularisation du Frontend
|
||||
|
||||
**Objectif:** Découper le fichier monolithique `app.js` en modules cohérents.
|
||||
|
||||
#### Étape 2.2.1: Créer la structure de modules
|
||||
- [ ] Créer `frontend/api/` pour les appels API
|
||||
- [ ] Créer `frontend/components/` pour les composants UI
|
||||
- [ ] Créer `frontend/utils/` pour les utilitaires
|
||||
- [ ] Créer `frontend/state/` pour la gestion d'état
|
||||
|
||||
**Dossiers à créer:**
|
||||
- `frontend/api/`
|
||||
- `frontend/components/`
|
||||
- `frontend/utils/`
|
||||
- `frontend/state/`
|
||||
|
||||
#### Étape 2.2.2: Créer le service API
|
||||
- [ ] Créer `frontend/api/client.js` avec le client HTTP
|
||||
- [ ] Créer `frontend/api/auth.js` pour les endpoints d'auth
|
||||
- [ ] Créer `frontend/api/challenges.js` pour les endpoints challenges
|
||||
- [ ] Supprimer le fetch wrapper monkey-patch
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `frontend/api/client.js`
|
||||
- `frontend/api/auth.js`
|
||||
- `frontend/api/challenges.js`
|
||||
|
||||
#### Étape 2.2.3: Extraire les composants UI
|
||||
- [ ] Créer `frontend/components/ChallengeList.js`
|
||||
- [ ] Créer `frontend/components/ChallengeForm.js`
|
||||
- [ ] Créer `frontend/components/TrackingForm.js`
|
||||
- [ ] Créer `frontend/components/Charts.js`
|
||||
- [ ] Créer `frontend/components/Navigation.js`
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `frontend/components/ChallengeList.js`
|
||||
- `frontend/components/ChallengeForm.js`
|
||||
- `frontend/components/TrackingForm.js`
|
||||
- `frontend/components/Charts.js`
|
||||
- `frontend/components/Navigation.js`
|
||||
|
||||
#### Étape 2.2.4: Créer les utilitaires
|
||||
- [ ] Créer `frontend/utils/notifications.js` pour les toasts
|
||||
- [ ] Créer `frontend/utils/storage.js` pour localStorage
|
||||
- [ ] Créer `frontend/utils/date.js` pour les formats de date
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `frontend/utils/notifications.js`
|
||||
- `frontend/utils/storage.js`
|
||||
- `frontend/utils/date.js`
|
||||
|
||||
#### Étape 2.2.5: Créer la gestion d'état
|
||||
- [ ] Créer `frontend/state/store.js` avec un store simple
|
||||
- [ ] Créer `frontend/state/actions.js` pour les actions
|
||||
- [ ] Créer `frontend/state/reducers.js` pour les reducers
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `frontend/state/store.js`
|
||||
- `frontend/state/actions.js`
|
||||
- `frontend/state/reducers.js`
|
||||
|
||||
#### Étape 2.2.6: Simplifier app.js
|
||||
- [ ] Réécrire `app.js` pour utiliser les modules
|
||||
- [ ] Initialiser l'application
|
||||
- [ ] Gérer le routing basique
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `frontend/app.js`
|
||||
|
||||
---
|
||||
|
||||
### 2.3 Expérience Développeur (DX)
|
||||
|
||||
**Objectif:** Améliorer les outils de développement.
|
||||
|
||||
#### Étape 2.3.1: Configurer Ruff (linter/formatter)
|
||||
- [ ] Installer `ruff` dans `requirements.txt`
|
||||
- [ ] Créer `ruff.toml` avec la configuration
|
||||
- [ ] Configurer les règles de linting
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `requirements.txt`
|
||||
- `ruff.toml` (nouveau)
|
||||
|
||||
#### Étape 2.3.2: Configurer MyPy (type checking)
|
||||
- [ ] Installer `mypy` dans `requirements.txt`
|
||||
- [ ] Créer `mypy.ini` avec la configuration
|
||||
- [ ] Ajouter les stubs nécessaires
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `requirements.txt`
|
||||
- `mypy.ini` (nouveau)
|
||||
|
||||
#### Étape 2.3.3: Configurer pre-commit hooks
|
||||
- [ ] Créer `.pre-commit-config.yaml`
|
||||
- [ ] Configurer les hooks Ruff et MyPy
|
||||
- [ ] Documenter l'installation
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `.pre-commit-config.yaml`
|
||||
|
||||
#### Étape 2.3.4: Créer un Makefile
|
||||
- [ ] Créer `Makefile` avec les commandes de dev
|
||||
- [ ] Ajouter les cibles: dev, test, lint, format, migrate
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `Makefile`
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Tests & CI/CD
|
||||
|
||||
### 3.1 Tests Backend
|
||||
|
||||
**Objectif:** Mettre en place une couverture de tests minimale.
|
||||
|
||||
#### Étape 3.1.1: Configurer pytest
|
||||
- [ ] Installer `pytest`, `pytest-cov`, `pytest-asyncio` dans `requirements.txt`
|
||||
- [ ] Créer `pytest.ini` avec la configuration
|
||||
- [ ] Créer `tests/conftest.py` avec les fixtures
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `requirements.txt`
|
||||
- `pytest.ini` (nouveau)
|
||||
- `tests/conftest.py` (nouveau)
|
||||
|
||||
#### Étape 3.1.2: Tests unitaires des services
|
||||
- [ ] Créer `tests/unit/test_auth_service.py`
|
||||
- [ ] Créer `tests/unit/test_challenge_service.py`
|
||||
- [ ] Créer `tests/unit/test_health_service.py`
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `tests/unit/test_auth_service.py`
|
||||
- `tests/unit/test_challenge_service.py`
|
||||
- `tests/unit/test_health_service.py`
|
||||
|
||||
#### Étape 3.1.3: Tests d'intégration API
|
||||
- [ ] Créer `tests/integration/test_api_auth.py`
|
||||
- [ ] Créer `tests/integration/test_api_challenges.py`
|
||||
- [ ] Créer `tests/integration/test_api_health.py`
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `tests/integration/test_api_auth.py`
|
||||
- `tests/integration/test_api_challenges.py`
|
||||
- `tests/integration/test_api_health.py`
|
||||
|
||||
#### Étape 3.1.4: Tests E2E
|
||||
- [ ] Créer `tests/e2e/test_user_flow.py`
|
||||
- [ ] Tester le flux complet: inscription → login → création challenge → tracking
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `tests/e2e/test_user_flow.py`
|
||||
|
||||
---
|
||||
|
||||
### 3.2 CI/CD avec GitHub Actions
|
||||
|
||||
**Objectif:** Automatiser les tests et le déploiement.
|
||||
|
||||
#### Étape 3.2.1: Créer le workflow CI
|
||||
- [ ] Créer `.github/workflows/ci.yml`
|
||||
- [ ] Configurer le job de tests
|
||||
- [ ] Configurer le job de linting
|
||||
- [ ] Configurer le reporting de couverture
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `.github/workflows/ci.yml`
|
||||
|
||||
#### Étape 3.2.2: Créer le workflow CD
|
||||
- [ ] Créer `.github/workflows/cd.yml`
|
||||
- [ ] Configurer le déploiement vers staging
|
||||
- [ ] Configurer le déploiement vers production
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `.github/workflows/cd.yml`
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Observabilité & Performance
|
||||
|
||||
### 4.1 Observabilité
|
||||
|
||||
**Objectif:** Mettre en place le monitoring et le logging.
|
||||
|
||||
#### Étape 4.1.1: Logging structuré
|
||||
- [ ] Installer `python-json-logger` dans `requirements.txt`
|
||||
- [ ] Créer `backend/core/logging.py`
|
||||
- [ ] Configurer le logging JSON
|
||||
- [ ] Remplacer les `print()` par des `logger.info()`
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `requirements.txt`
|
||||
- `backend/core/logging.py`
|
||||
|
||||
#### Étape 4.1.2: Health check endpoint
|
||||
- [ ] Créer le endpoint `/api/health`
|
||||
- [ ] Vérifier la connexion à la base de données
|
||||
- [ ] Retourner le statut de l'application
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `backend/api/v1/health.py`
|
||||
|
||||
#### Étape 4.1.3: Métriques Prometheus
|
||||
- [ ] Installer `prometheus-fastapi-instrumentator` dans `requirements.txt`
|
||||
- [ ] Configurer l'instrumentation dans `main.py`
|
||||
- [ ] Exposer le endpoint `/metrics`
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `requirements.txt`
|
||||
- `backend/main.py`
|
||||
|
||||
---
|
||||
|
||||
### 4.2 Performance Base de Données
|
||||
|
||||
**Objectif:** Optimiser les requêtes et l'indexation.
|
||||
|
||||
#### Étape 4.2.1: Ajouter des indexes
|
||||
- [ ] Créer une migration Alembic pour les indexes
|
||||
- [ ] Ajouter index sur `challenges(user_id, display_order)`
|
||||
- [ ] Ajouter index sur `challenges(user_id, period_type)`
|
||||
- [ ] Ajouter index sur `tracking(challenge_id, date)`
|
||||
- [ ] Ajouter index sur `tracking(date)`
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `alembic/versions/xxxx_add_indexes.py`
|
||||
|
||||
#### Étape 4.2.2: Eager loading
|
||||
- [ ] Modifier les repositories pour utiliser `selectinload`
|
||||
- [ ] Éliminer les N+1 queries
|
||||
- [ ] Optimiser les requêtes d'agrégation
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `backend/repositories/challenge_repository.py`
|
||||
|
||||
#### Étape 4.2.3: Pagination
|
||||
- [ ] Ajouter la pagination aux endpoints de liste
|
||||
- [ ] Créer les schemas de pagination
|
||||
- [ ] Documenter les paramètres de pagination
|
||||
|
||||
**Fichiers à créer/modifier:**
|
||||
- `backend/schemas/pagination.py`
|
||||
- `backend/api/v1/challenges.py`
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: UX & Documentation
|
||||
|
||||
### 5.1 Améliorations UX
|
||||
|
||||
**Objectif:** Améliorer l'expérience utilisateur.
|
||||
|
||||
#### Étape 5.1.1: Notifications/Toasts
|
||||
- [ ] Créer le système de notifications dans `frontend/utils/notifications.js`
|
||||
- [ ] Ajouter des toasts pour les actions réussies
|
||||
- [ ] Ajouter des toasts pour les erreurs
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `frontend/utils/notifications.js`
|
||||
|
||||
#### Étape 5.1.2: Loading states
|
||||
- [ ] Ajouter des spinners pendant les appels API
|
||||
- [ ] Désactiver les boutons pendant le chargement
|
||||
- [ ] Ajouter des indicateurs de progression
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `frontend/components/ChallengeForm.js`
|
||||
- `frontend/components/TrackingForm.js`
|
||||
|
||||
#### Étape 5.1.3: Gestion d'erreurs utilisateur
|
||||
- [ ] Afficher des messages d'erreur clairs
|
||||
- [ ] Proposer des solutions aux erreurs courantes
|
||||
- [ ] Logger les erreurs côté client
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `frontend/api/client.js`
|
||||
- `frontend/app.js`
|
||||
|
||||
---
|
||||
|
||||
### 5.2 Documentation
|
||||
|
||||
**Objectif:** Documenter le projet pour les développeurs.
|
||||
|
||||
#### Étape 5.2.1: Docstrings API
|
||||
- [ ] Ajouter des docstrings à toutes les fonctions
|
||||
- [ ] Documenter les paramètres et les retours
|
||||
- [ ] Utiliser le format Google ou NumPy
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- Tous les fichiers Python dans `backend/`
|
||||
|
||||
#### Étape 5.2.2: README amélioré
|
||||
- [ ] Mettre à jour `README.md`
|
||||
- [ ] Ajouter la section Installation
|
||||
- [ ] Ajouter la section Configuration
|
||||
- [ ] Ajouter la section Développement
|
||||
- [ ] Ajouter la section Déploiement
|
||||
|
||||
**Fichiers à modifier:**
|
||||
- `README.md`
|
||||
|
||||
#### Étape 5.2.3: Architecture Decision Records (ADRs)
|
||||
- [ ] Créer `docs/adr/`
|
||||
- [ ] Documenter les décisions d'architecture majeures
|
||||
- [ ] Utiliser le template ADR standard
|
||||
|
||||
**Fichiers à créer:**
|
||||
- `docs/adr/001-architecture-backend.md`
|
||||
- `docs/adr/002-choix-postgresql.md`
|
||||
- `docs/adr/003-securite-jwt.md`
|
||||
|
||||
---
|
||||
|
||||
## Résumé des Fichiers à Créer
|
||||
|
||||
### Configuration
|
||||
- `.env.example`
|
||||
- `.env.development`
|
||||
- `.env.staging`
|
||||
- `.env.production`
|
||||
- `ruff.toml`
|
||||
- `mypy.ini`
|
||||
- `pytest.ini`
|
||||
- `.pre-commit-config.yaml`
|
||||
- `Makefile`
|
||||
|
||||
### Backend - Core
|
||||
- `backend/core/config.py`
|
||||
- `backend/core/security.py`
|
||||
- `backend/core/deps.py`
|
||||
- `backend/core/logging.py`
|
||||
- `backend/core/__init__.py`
|
||||
|
||||
### Backend - API
|
||||
- `backend/api/v1/auth.py`
|
||||
- `backend/api/v1/challenges.py`
|
||||
- `backend/api/v1/health.py`
|
||||
- `backend/api/v1/__init__.py`
|
||||
|
||||
### Backend - Models
|
||||
- `backend/models/user.py`
|
||||
- `backend/models/challenge.py`
|
||||
- `backend/models/tracking.py`
|
||||
- `backend/models/__init__.py`
|
||||
|
||||
### Backend - Schemas
|
||||
- `backend/schemas/user.py`
|
||||
- `backend/schemas/challenge.py`
|
||||
- `backend/schemas/tracking.py`
|
||||
- `backend/schemas/pagination.py`
|
||||
- `backend/schemas/__init__.py`
|
||||
|
||||
### Backend - Services
|
||||
- `backend/services/auth_service.py`
|
||||
- `backend/services/challenge_service.py`
|
||||
- `backend/services/health_service.py`
|
||||
- `backend/services/__init__.py`
|
||||
|
||||
### Backend - Repositories
|
||||
- `backend/repositories/base.py`
|
||||
- `backend/repositories/user_repository.py`
|
||||
- `backend/repositories/challenge_repository.py`
|
||||
- `backend/repositories/__init__.py`
|
||||
|
||||
### Backend - Integrations
|
||||
- `backend/integrations/google_fit.py`
|
||||
- `backend/integrations/import_zepp.py`
|
||||
- `backend/integrations/__init__.py`
|
||||
|
||||
### Frontend - API
|
||||
- `frontend/api/client.js`
|
||||
- `frontend/api/auth.js`
|
||||
- `frontend/api/challenges.js`
|
||||
|
||||
### Frontend - Components
|
||||
- `frontend/components/ChallengeList.js`
|
||||
- `frontend/components/ChallengeForm.js`
|
||||
- `frontend/components/TrackingForm.js`
|
||||
- `frontend/components/Charts.js`
|
||||
- `frontend/components/Navigation.js`
|
||||
|
||||
### Frontend - Utils
|
||||
- `frontend/utils/notifications.js`
|
||||
- `frontend/utils/storage.js`
|
||||
- `frontend/utils/date.js`
|
||||
|
||||
### Frontend - State
|
||||
- `frontend/state/store.js`
|
||||
- `frontend/state/actions.js`
|
||||
- `frontend/state/reducers.js`
|
||||
|
||||
### Tests
|
||||
- `tests/conftest.py`
|
||||
- `tests/unit/test_auth_service.py`
|
||||
- `tests/unit/test_challenge_service.py`
|
||||
- `tests/unit/test_health_service.py`
|
||||
- `tests/integration/test_api_auth.py`
|
||||
- `tests/integration/test_api_challenges.py`
|
||||
- `tests/integration/test_api_health.py`
|
||||
- `tests/e2e/test_user_flow.py`
|
||||
|
||||
### CI/CD
|
||||
- `.github/workflows/ci.yml`
|
||||
- `.github/workflows/cd.yml`
|
||||
|
||||
### Docker & Nginx
|
||||
- `docker-compose.dev.yml`
|
||||
- `docker-compose.prod.yml`
|
||||
- `nginx/nginx.conf`
|
||||
- `nginx/Dockerfile`
|
||||
|
||||
### Scripts
|
||||
- `scripts/migrate_to_postgres.py`
|
||||
- `scripts/backup_db.sh`
|
||||
- `scripts/start_prod.sh`
|
||||
|
||||
### Documentation
|
||||
- `docs/adr/001-architecture-backend.md`
|
||||
- `docs/adr/002-choix-postgresql.md`
|
||||
- `docs/adr/003-securite-jwt.md`
|
||||
|
||||
---
|
||||
|
||||
## Checklist de Validation
|
||||
|
||||
Avant de considérer le projet comme "production-ready", vérifier:
|
||||
|
||||
### Sécurité
|
||||
- [ ] Aucun secret hardcodé dans le code
|
||||
- [ ] CORS configuré avec des origines spécifiques
|
||||
- [ ] Rate limiting activé
|
||||
- [ ] HTTPS configuré en production
|
||||
- [ ] Secrets Google exclus du git
|
||||
|
||||
### Base de Données
|
||||
- [ ] PostgreSQL utilisé en production
|
||||
- [ ] Backups automatisés en place
|
||||
- [ ] Indexes créés sur les colonnes fréquentes
|
||||
- [ ] N+1 queries éliminées
|
||||
|
||||
### Architecture
|
||||
- [ ] Backend restructuré avec séparation des responsabilités
|
||||
- [ ] Couche de services créée
|
||||
- [ ] Frontend modularisé
|
||||
- [ ] Configuration centralisée
|
||||
|
||||
### Tests
|
||||
- [ ] Tests unitaires backend créés
|
||||
- [ ] Tests d'intégration API créés
|
||||
- [ ] Tests E2E créés
|
||||
- [ ] Couverture minimale de 70%
|
||||
|
||||
### CI/CD
|
||||
- [ ] Pipeline CI configuré
|
||||
- [ ] Pipeline CD configuré
|
||||
- [ ] Tests exécutés automatiquement
|
||||
|
||||
### Observabilité
|
||||
- [ ] Logging structuré en place
|
||||
- [ ] Health check endpoint créé
|
||||
- [ ] Métriques Prometheus exposées
|
||||
|
||||
### DX
|
||||
- [ ] Linter configuré (Ruff)
|
||||
- [ ] Type checker configuré (MyPy)
|
||||
- [ ] Pre-commit hooks configurés
|
||||
- [ ] Makefile créé
|
||||
|
||||
### Documentation
|
||||
- [ ] README à jour
|
||||
- [ ] Docstrings ajoutées
|
||||
- [ ] ADRs créés
|
||||
|
||||
---
|
||||
|
||||
## Notes Importantes
|
||||
|
||||
1. **Ordre d'exécution:** Les phases doivent être exécutées dans l'ordre indiqué. La Phase 1 (Sécurité) est critique et doit être complétée avant tout déploiement en production.
|
||||
|
||||
2. **Tests continus:** À chaque étape, exécuter les tests existants pour s'assurer que rien n'est cassé.
|
||||
|
||||
3. **Documentation:** Mettre à jour la documentation à mesure que des changements sont apportés.
|
||||
|
||||
4. **Commits:** Faire des commits fréquents et descriptifs pour faciliter le rollback si nécessaire.
|
||||
|
||||
5. **Review:** Faire une revue de code après chaque phase majeure.
|
||||
|
||||
---
|
||||
|
||||
**Fin du Plan de Correction**
|
||||
Reference in New Issue
Block a user