Files
office_translator/docs/GESTION-UTILISATEURS.md
Sepehr Ramezani 26bd096a06 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>
2026-04-25 15:01:47 +02:00

52 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Gestion des utilisateurs — référence technique
## 1. Deux emplacements possibles pour un compte
| Emplacement | Fichier / système | Quand cest 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). |
Lauthentification (`get_user_by_email`, etc.) lit **dabord la base**, puis **repli** sur `users.json` si lutilisateur ny est pas (`services/auth_service.py`).
## 2. Bug corrigé : liste admin vide alors quun compte existe
**Cause** : `GET /api/v1/admin/users` ne lisait **que** la table SQL `users`. Un compte présent **uniquement** dans `data/users.json` napparaissait **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** le-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 nexiste pas encore de flux « mot de passe oublié » par **e-mail** côté utilisateur final (pas denvoi SMTP dans ce flux).
## 5. Statistiques admin (`GET /api/v1/admin/stats`)
Le total dutilisateurs 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.