feat: production deployment - full update with providers, admin, glossaries, pricing, tests
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>
This commit is contained in:
51
docs/GESTION-UTILISATEURS.md
Normal file
51
docs/GESTION-UTILISATEURS.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user