# Guide de déploiement manuel - Corrections Panel Admin

## ⚠️ IMPORTANT : Ordre d'exécution

**Exécuter dans cet ordre strict** :
1. Migration de la base de données (OBLIGATOIRE en premier)
2. Backend
3. Frontend
4. Initialisation des valeurs par défaut (optionnel mais recommandé)

---

## 🔧 Déploiement par étapes

### Préparation locale

```powershell
# 1. Compiler le frontend
cd "d:\WEB API\web-sentinel\admin\frontend"
npm run build

# Résultat : fichiers dans dist/
```

### Connexion au serveur

```bash
# Test de connexion
ssh bruno@51.83.45.207

# Vérifier les conteneurs
docker ps | grep -E '(admin-backend|admin-frontend|sentinel-db)'
```

---

## ÉTAPE 1 : Migration de la base de données ⚠️ CRITIQUE

**À faire EN PREMIER** sinon les modifications de licences échoueront !

```bash
# Sur votre machine locale
scp admin/backend/migrate_users_table.py bruno@51.83.45.207:/tmp/

# Sur le serveur
ssh bruno@51.83.45.207
docker cp /tmp/migrate_users_table.py web-sentinel-admin-backend:/app/
docker exec web-sentinel-admin-backend python3 /app/migrate_users_table.py

# Vérifier les logs (doit dire "Migration completed!")
```

**Ce que fait la migration** :
- Ajoute 10 colonnes à la table `users` : max_domains, max_users, allow_source_scan, max_source_files, max_source_size_mb, advanced_rules, stripe_customer_id, stripe_subscription_id, updated_at, events
- Utilise `IF NOT EXISTS` donc peut être réexécutée sans danger
- Ne modifie PAS les données existantes (valeurs par défaut seulement)

---

## ÉTAPE 2 : Backend

```bash
# Sur votre machine locale
scp admin/backend/app/models/license.py bruno@51.83.45.207:/tmp/
scp admin/backend/app/routers/dashboard.py bruno@51.83.45.207:/tmp/

# Sur le serveur
ssh bruno@51.83.45.207
docker cp /tmp/license.py web-sentinel-admin-backend:/app/app/models/
docker cp /tmp/dashboard.py web-sentinel-admin-backend:/app/app/routers/

# Redémarrer le backend
docker restart web-sentinel-admin-backend

# Vérifier les logs (attendre 5-10 secondes)
docker logs --tail 20 web-sentinel-admin-backend

# Vous devez voir : "INFO: Uvicorn running on http://0.0.0.0:8000"
```

**Ce que fait le backend** :
- Le modèle `License` utilise maintenant de vraies colonnes (plus de @property)
- L'endpoint dashboard retourne le count `pro`
- Les modifications de licences fonctionnent maintenant

---

## ÉTAPE 3 : Frontend

```bash
# Sur votre machine locale
scp -r admin/frontend/dist/* bruno@51.83.45.207:/tmp/frontend-dist/

# Sur le serveur
ssh bruno@51.83.45.207
docker cp /tmp/frontend-dist/. deployment-admin-frontend:/usr/share/nginx/html/

# Redémarrer le frontend
docker restart deployment-admin-frontend

# Nettoyage
rm -rf /tmp/frontend-dist /tmp/*.py
```

**Ce que fait le frontend** :
- Ajoute la carte "Pro" dans le dashboard (5 cartes au total)
- Type TypeScript `DashboardSummary` inclut maintenant `pro: number`

---

## ÉTAPE 4 : Initialisation des valeurs (RECOMMANDÉ)

**Après la migration**, les utilisateurs ont des valeurs par défaut (max_domains=1, etc.). Ce script les configure correctement selon leur tier :

```bash
# Sur votre machine locale
scp admin/backend/init_tier_defaults.py bruno@51.83.45.207:/tmp/

# Sur le serveur
ssh bruno@51.83.45.207
docker cp /tmp/init_tier_defaults.py web-sentinel-admin-backend:/app/
docker exec web-sentinel-admin-backend python3 /app/init_tier_defaults.py

# Vérifier les mises à jour (doit afficher le nombre d'utilisateurs par tier)
```

**Configuration appliquée** :

| Tier | max_domains | max_users | allow_source_scan | max_source_files | max_source_size_mb | advanced_rules |
|------|-------------|-----------|-------------------|------------------|-------------------|----------------|
| FREE | 1 | 1 | false | 0 | 0 | false |
| PRO | 10 | 5 | true | 100 | 50 | false |
| ENTERPRISE | 50 | 50 | true | 1000 | 500 | true |
| SYSOP | 999 | 999 | true | 9999 | 9999 | true |

---

## ✅ Vérification

### 1. Dashboard
Accéder à : https://admin.web-sentinel.taaazzz-prog.fr

**Reconnecter-vous** (token JWT expiré après redémarrage backend)

Vérifier les 5 cartes :
- Total Licences : 11 ✅
- Actives : 11 ✅
- Suspendues : 0 ✅
- Enterprise : 1 ✅
- **Pro : 1 ✅** (NOUVEAU)

### 2. Test de modification

Dans **Licences** → Sélectionner bruno@taaazzz.be (PRO) → Modifier :
- Changer `max_domains` de 10 à 15
- Activer `allow_source_scan`
- Sauvegarder

Vérifier que les changements sont persistés (recharger la page).

### 3. Test de suppression (soft delete)

Dans **Licences** → Sélectionner un compte de test → Supprimer

**Résultat attendu** :
- Le compte n'est PAS supprimé de la base
- Il est rétrogradé vers tier FREE
- max_domains = 1, allow_source_scan = false

Pour vérifier :
```bash
ssh bruno@51.83.45.207
docker exec -it web-sentinel-db psql -U websentinel -d websentinel_prod -c "SELECT email, tier, max_domains FROM users WHERE email LIKE '%test%';"
```

### 4. API Backend

Tester l'endpoint summary :
```bash
curl -H "Authorization: Bearer YOUR_TOKEN" https://admin-api.web-sentinel.taaazzz-prog.fr/api/v1/dashboard/summary
```

Doit retourner :
```json
{
  "total": 11,
  "active": 11,
  "suspended": 0,
  "enterprise": 1,
  "pro": 1
}
```

---

## 🐛 Dépannage

### Problème : "Column does not exist" après modification

**Cause** : Migration non exécutée

**Solution** :
```bash
ssh bruno@51.83.45.207
docker exec web-sentinel-admin-backend python3 /app/migrate_users_table.py
docker restart web-sentinel-admin-backend
```

### Problème : Dashboard ne montre pas "Pro"

**Cause** : Frontend pas recompilé ou cache navigateur

**Solution** :
1. Vider le cache navigateur (Ctrl+F5)
2. Recompiler : `cd admin/frontend && npm run build`
3. Re-déployer le frontend (voir ÉTAPE 3)

### Problème : 401 Unauthorized

**Cause** : Token JWT expiré (durée 60 minutes)

**Solution** : Se reconnecter au panel admin

### Problème : Les modifications ne se sauvegardent pas

**Cause** : Le modèle License utilise encore des @property

**Solution** :
```bash
# Vérifier que le nouveau license.py est bien déployé
ssh bruno@51.83.45.207
docker exec web-sentinel-admin-backend grep "Column(Integer, default=1)" /app/app/models/license.py

# Doit retourner : max_domains = Column(Integer, default=1)
# Si pas de résultat, re-déployer le backend (ÉTAPE 2)
```

---

## 📋 Checklist finale

- [ ] Migration exécutée (10 colonnes ajoutées)
- [ ] Backend redémarré (logs OK)
- [ ] Frontend redémarré (dist/ copié)
- [ ] Valeurs par défaut initialisées (script init_tier_defaults.py)
- [ ] Dashboard affiche 5 cartes dont "Pro"
- [ ] Test modification licence → OK
- [ ] Test suppression → rétrogradation vers FREE
- [ ] Commit git créé : 46119cf
- [ ] Push GitHub effectué

---

## 📚 Fichiers modifiés

```
admin/
├── CORRECTIONS_7NOV.md               # Ce guide détaillé
├── DEPLOY_MANUAL.md                  # Guide que vous lisez
├── deploy-corrections.ps1            # Script automatique (si SSH fonctionne)
├── backend/
│   ├── migrate_users_table.py        # Migration DB (10 colonnes)
│   ├── init_tier_defaults.py         # Initialisation valeurs par tier
│   └── app/
│       ├── models/license.py         # Colonnes réelles (plus de @property)
│       └── routers/dashboard.py      # Ajout count 'pro'
└── frontend/
    ├── src/
    │   ├── api.ts                    # Type DashboardSummary + 'pro'
    │   └── components/Dashboard.tsx  # Carte "Pro" dans UI
    └── dist/                         # Frontend compilé
```

---

## 🎯 Résumé des corrections

| Problème | Solution | Fichier |
|----------|----------|---------|
| PRO pas visible dans dashboard | Ajout carte + type TS | Dashboard.tsx, api.ts |
| Pas de bouton supprimer | Utiliser l'onglet Licences | (existant) |
| Comptes FREE avec API key | **Normal** - tous ont besoin d'une clé | (aucun) |
| Champs Stripe vides | Colonnes ajoutées pour futur | migrate_users_table.py |
| Modifications ne fonctionnent pas | Colonnes réelles au lieu de @property | license.py |

---

## ⏭️ Prochaines étapes (optionnel)

1. **Intégration Stripe** : Remplir stripe_customer_id et stripe_subscription_id
2. **Tracking events** : Ajouter des événements dans la colonne events (JSON)
3. **Usage_count** : Calculer depuis la table scans
4. **Hard delete** : Ajouter un bouton "Supprimer définitivement" (endpoint existe déjà : `DELETE /api/v1/licenses/{api_key}/hard`)

---

📅 **Date** : 7 novembre 2025  
🔗 **Commit** : 46119cf  
✅ **Statut** : Prêt pour déploiement
