# Gestion des utilisateurs — référence technique ## 1. Deux emplacements possibles pour un compte | Emplacement | Fichier / système | Quand c’est utilisé | |-------------|-------------------|---------------------| | **Base SQLAlchemy** | Table `users` dans `data/translate.db` (SQLite par défaut) ou PostgreSQL | Inscription et authentification lorsque le module base est chargé (`services/auth_service.py`). | | **Fichier JSON** | `data/users.json` | Ancien mode « fichier seul », ou compte créé avant migration, ou utilisateur présent uniquement ici (legacy). | L’authentification (`get_user_by_email`, etc.) lit **d’abord la base**, puis **repli** sur `users.json` si l’utilisateur n’y est pas (`services/auth_service.py`). ## 2. Bug corrigé : liste admin vide alors qu’un compte existe **Cause** : `GET /api/v1/admin/users` ne lisait **que** la table SQL `users`. Un compte présent **uniquement** dans `data/users.json` n’apparaissait **jamais**. **Correction** : la route agrège : 1. Tous les utilisateurs de la base (ordre `created_at` décroissant). 2. Les entrées de `users.json` dont l’`id` **et** l’e-mail (normalisé) ne sont **pas** déjà couverts par la base (évite les doublons). Chaque ligne comporte un champ **`storage`** : `database` ou `json_file`. ## 3. Endpoints admin concernés | Méthode | Chemin | Rôle | |---------|--------|------| | `GET` | `/api/v1/admin/users` | Liste fusionnée (base + JSON-only). | | `PATCH` | `/api/v1/admin/users/{user_id}` | Changement de plan (`plan`). | | `POST` | `/api/v1/admin/users/{user_id}/password` | Corps JSON `{ "new_password": "..." }` (min. 8 caractères). Définit le hash en base **ou** dans `users.json` selon où vit le compte. | Authentification : en-tête `Authorization: Bearer ` (pas le JWT utilisateur). ## 4. Réinitialisation du mot de passe (compte existant, mot de passe oublié) 1. Se connecter à l’**admin**. 2. Aller dans **Utilisateurs**. 3. Repérer la ligne (colonne **Stockage** : **Base** ou **JSON**). 4. Cliquer **MDP**, saisir le nouveau mot de passe deux fois, valider. Il n’existe pas encore de flux « mot de passe oublié » par **e-mail** côté utilisateur final (pas d’envoi SMTP dans ce flux). ## 5. Statistiques admin (`GET /api/v1/admin/stats`) Le total d’utilisateurs et la répartition par plan incluent désormais **base + utilisateurs JSON-only**, de façon cohérente avec la liste utilisateurs. ## 6. Fichiers de code principaux - `routes/admin_routes.py` — `get_admin_users`, `admin_reset_user_password`, `get_admin_stats`. - `services/auth_service.py` — `admin_set_user_password`, `load_users`, `get_user_by_email`. - `database/repositories.py` — `UserRepository`. - `frontend/src/app/admin/users/` — tableau, dialogue mot de passe, hooks.