Major changes across backend, frontend, infrastructure: - Provider system with model selection (Google, DeepL, OpenAI, Ollama, Google Cloud) - Admin panel: user management, pricing, settings - Glossary system with CSV import/export - Subscription and tier quota management - Security hardening (rate limiting, API key auth, path traversal fixes) - Docker compose for dev, prod, and IONOS deployment - Alembic migrations for new tables - Frontend: dashboard, pricing page, landing page, i18n (en/fr) - Test suite and verification scripts Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
52 lines
2.8 KiB
Markdown
52 lines
2.8 KiB
Markdown
# 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 <token admin>` (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.
|