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:
Sepehr Ramezani
2026-04-25 15:01:47 +02:00
parent 2ba4fedfc8
commit 26bd096a06
1178 changed files with 136435 additions and 3047 deletions

View File

@@ -0,0 +1,51 @@
# 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.