# 🔧 Scripts de Migration et Test - Quotas SAST

## Vue d'ensemble

Ce dossier contient les scripts pour migrer la base de données PostgreSQL et tester le système de quotas SAST (Static Application Security Testing).

## Fichiers

### 1. `migrate_add_sast_columns.sql`

**Type:** Script SQL pur  
**Usage:** Migration manuelle via `psql`

Ajoute les 4 colonnes SAST dans la table `api_key` et met à jour toutes les licences existantes avec les quotas appropriés selon leur tier.

**Colonnes ajoutées:**
- `allow_source_scan` (BOOLEAN) - Autorisation de scanner du code source
- `max_source_files` (INTEGER) - Nombre maximum de fichiers par scan
- `max_source_size_mb` (INTEGER) - Taille maximale totale en MB
- `advanced_rules` (BOOLEAN) - Règles de scan avancées activées

**Exécution:**
```bash
# Option 1: Via psql (ligne de commande)
psql $DATABASE_URL -f scripts/database/migrate_add_sast_columns.sql

# Option 2: Via connexion interactive
psql postgresql://user:password@host:5432/websentinel_prod
\i scripts/database/migrate_add_sast_columns.sql
```

**Quotas appliqués:**
| Tier | allow_source_scan | max_source_files | max_source_size_mb | advanced_rules |
|------|-------------------|------------------|-------------------|----------------|
| FREE | ❌ FALSE | 0 | 0 MB | ❌ FALSE |
| PRO | ✅ TRUE | 100 | 20 MB | ❌ FALSE |
| ENTERPRISE | ✅ TRUE | 500 | 100 MB | ✅ TRUE |
| SYSOP | ✅ TRUE | 9999 | 500 MB | ✅ TRUE |

---

### 2. `migrate_sast_columns.py`

**Type:** Script Python automatisé  
**Usage:** Migration automatique avec validation

Même fonctionnalité que le script SQL mais avec:
- ✅ Validation des colonnes existantes
- ✅ Affichage progressif de la migration
- ✅ Rapport détaillé par tier
- ✅ Gestion d'erreurs

**Prérequis:**
```bash
pip install psycopg2-binary python-dotenv
```

**Variables d'environnement requises:**
```bash
# .env ou export
WEB_SENTINEL_POSTGRES_URL=postgresql://user:password@host:5432/websentinel_prod
# OU
DATABASE_URL=postgresql://user:password@host:5432/websentinel_prod
```

**Exécution:**
```bash
# Depuis la racine du projet
python scripts/database/migrate_sast_columns.py
```

**Exemple de sortie:**
```
🚀 Démarrage de la migration SAST...
📦 Base de données: host:5432/websentinel_prod

📝 Étape 1: Ajout des colonnes SAST...
   ✅ Colonnes ajoutées

📊 Étape 2: Récupération des licences existantes...
   📌 25 licences trouvées

🔄 Étape 3: Mise à jour des quotas par tier...
   ✓ user1@example.com (PRO): 100 fichiers, 20 MB, règles avancées: False
   ✓ user2@example.com (ENTERPRISE): 500 fichiers, 100 MB, règles avancées: True
   ...

📈 Étape 4: Vérification des résultats...
┌─────────────┬───────┬──────────┬──────────────┬─────────────┐
│ Tier        │ Total │ Avec SAST│ Moy. Fichiers│ Moy. Taille │
├─────────────┼───────┼──────────┼──────────────┼─────────────┤
│ SYSOP       │     2 │        2 │         9999 │      500 MB │
│ ENTERPRISE  │     5 │        5 │          500 │      100 MB │
│ PRO         │    12 │       12 │          100 │       20 MB │
│ FREE        │     6 │        0 │            0 │        0 MB │
└─────────────┴───────┴──────────┴──────────────┴─────────────┘

✅ Migration terminée avec succès!
```

---

### 3. `test_sast_quotas.py`

**Type:** Script de test automatisé  
**Usage:** Validation complète du système de quotas

Effectue 4 séries de tests:
1. **Création de licences** - Crée 4 licences de test (FREE, PRO, ENTERPRISE, SYSOP)
2. **Vérification des quotas** - Valide que chaque tier a les bons quotas
3. **Mise à jour** - Teste l'upgrade PRO → ENTERPRISE
4. **Listing** - Vérifie le listing de toutes les licences

**Prérequis:**
```bash
pip install psycopg2-binary python-dotenv
```

**Variables d'environnement:**
```bash
WEB_SENTINEL_POSTGRES_URL=postgresql://user:password@host:5432/websentinel_prod
WEB_SENTINEL_LICENSE_BACKEND=postgresql
```

**Exécution:**
```bash
# Depuis la racine du projet
python scripts/database/test_sast_quotas.py
```

**Exemple de sortie (succès):**
```
🧪 Test des quotas SAST
============================================================
✓ Store initialisé: PostgresLicenseStore

📝 Test 1: Création de licences de test
------------------------------------------------------------
   ✓ FREE         : API Key = ws_live_abc123...
      allow_source_scan  = False
      max_source_files   = 0
      max_source_size_mb = 0
      advanced_rules     = False
   ✓ PRO          : API Key = ws_live_def456...
      allow_source_scan  = True
      max_source_files   = 100
      max_source_size_mb = 20
      advanced_rules     = False
   ...

🔍 Test 2: Récupération et vérification des quotas
------------------------------------------------------------
   ✓ FREE         max_source_files     = 0 (attendu: 0)
   ✓ FREE         max_source_size_mb   = 0 (attendu: 0)
   ✓ FREE         allow_source_scan    = False (attendu: False)
   ✓ FREE         advanced_rules       = False (attendu: False)
   ...

🔄 Test 3: Mise à jour des quotas
------------------------------------------------------------
   📝 Upgrade PRO → ENTERPRISE (API Key: ws_live_def456...)
   ✓ Mise à jour réussie: 500 fichiers

📊 Test 4: Listing de toutes les licences
------------------------------------------------------------
   📌 Total licences: 29
   🧪 Licences de test: 4
   ✓ Au moins 4 licences de test trouvées

============================================================
✅ TOUS LES TESTS SONT PASSÉS!
```

---

## 🚀 Procédure Complète de Migration

### Étape 1: Backup de la base de données

```bash
# Backup PostgreSQL
pg_dump $DATABASE_URL > backup_$(date +%Y%m%d_%H%M%S).sql
```

### Étape 2: Exécuter la migration

**Option A: Script Python (recommandé)**
```bash
python scripts/database/migrate_sast_columns.py
```

**Option B: Script SQL manuel**
```bash
psql $DATABASE_URL -f scripts/database/migrate_add_sast_columns.sql
```

### Étape 3: Tester la migration

```bash
python scripts/database/test_sast_quotas.py
```

### Étape 4: Redémarrer les services

```bash
# Backend admin
cd admin/backend
uvicorn app.main:app --reload --port 8000

# Frontend admin (nouveau terminal)
cd admin/frontend
npm run dev
```

### Étape 5: Tests manuels

1. **Ouvrir l'admin:** http://localhost:3000
2. **Créer une nouvelle licence PRO:**
   - Email: `test-pro@example.com`
   - Tier: PRO
   - Vérifier que `max_source_files = 100`
3. **Éditer une licence existante:**
   - Passer de PRO à ENTERPRISE
   - Vérifier que `max_source_files` passe à 500
4. **Vérifier les webhooks Stripe:**
   - Créer un abonnement via la page de pricing
   - Vérifier que la licence créée a les bons quotas

---

## ⚠️ Troubleshooting

### Erreur: "column already exists"

La migration a déjà été exécutée. Vérifier avec:
```sql
SELECT column_name 
FROM information_schema.columns 
WHERE table_name = 'api_key' 
  AND column_name IN ('allow_source_scan', 'max_source_files', 'max_source_size_mb', 'advanced_rules');
```

### Erreur: "DATABASE_URL not defined"

Définir la variable d'environnement:
```bash
export WEB_SENTINEL_POSTGRES_URL="postgresql://user:password@host:5432/websentinel_prod"
```

### Tests échouent avec "quotas incorrects"

Vérifier manuellement les valeurs:
```sql
SELECT email, tier, allow_source_scan, max_source_files, max_source_size_mb, advanced_rules
FROM api_key
WHERE email LIKE 'test_%';
```

### Backend admin ne démarre pas

Vérifier les imports dans `admin/backend/app/models/license.py`:
```python
# Devrait contenir:
allow_source_scan = Column(Boolean, default=False)
max_source_files = Column(Integer, default=0)
max_source_size_mb = Column(Integer, default=0)
advanced_rules = Column(Boolean, default=False)
```

---

## 📚 Références

- **Schéma complet:** `docs/DATABASE_SCHEMA_POSTGRESQL.md`
- **Matrice d'abonnement:** `web_sentinel/subscription/models.py`
- **Store PostgreSQL:** `web_sentinel/payment/postgres_store.py`
- **Valeurs par défaut:** `admin/backend/app/sast_defaults.py`

---

**Auteur:** Équipe Web Sentinel  
**Date:** 7 novembre 2025  
**Version:** 1.0
