# Guide de Dépannage - Problèmes de Connexion

## Problème : "Identifiant ou mot de passe incorrect"

Si vous ne parvenez pas à vous connecter avec l'utilisateur `adminServFormation` et le mot de passe `Itinova69!`, suivez ce guide étape par étape.

---

## Diagnostic rapide

### Étape 1 : Exécuter le script de diagnostic

```bash
cd /chemin/vers/formation-manager-itinova
./diagnose.sh
```

Ce script vérifie automatiquement :
- Les variables d'environnement (DATABASE_URL, JWT_SECRET)
- La connexion à la base de données
- L'existence des tables
- L'existence de l'utilisateur adminServFormation
- Les dépendances installées
- L'état du service

---

## Solutions par cause

### Cause 1 : JWT_SECRET non défini

**Symptôme** : Le diagnostic affiche `JWT_SECRET n'est pas définie`

**Solution** :

1. Générer une clé JWT sécurisée :
   ```bash
   openssl rand -base64 32
   ```

2. Ajouter la clé dans le fichier `.env` :
   ```bash
   echo "JWT_SECRET=votre_cle_generee_ici" >> .env
   ```

3. Redémarrer l'application :
   ```bash
   # Si vous utilisez systemd
   sudo systemctl restart formation-manager
   
   # Ou en développement
   pnpm dev
   ```

---

### Cause 2 : L'utilisateur adminServFormation n'existe pas

**Symptôme** : Le diagnostic affiche `Utilisateur 'adminServFormation' n'existe pas`

**Solution** :

Exécuter le script de réinitialisation :

```bash
./reset-admin-sql.sh
```

**Note** : Utilisez `reset-admin-sql.sh` (version SQL directe) plutôt que `reset-admin.sh` pour éviter les problèmes de compilation TypeScript.

Ce script va :
- Vérifier la configuration
- Créer l'utilisateur adminServFormation s'il n'existe pas
- Réinitialiser le mot de passe s'il existe déjà
- Afficher les identifiants de connexion

**Résultat attendu** :
```
✅ Utilisateur créé avec succès

🔑 Vous pouvez maintenant vous connecter avec:
   Identifiant: adminServFormation
   Mot de passe: Itinova69!
```

---

### Cause 3 : Les tables de la base de données n'existent pas

**Symptôme** : Le diagnostic affiche `Aucune table trouvée dans la base de données`

**Solution** :

1. Appliquer les migrations :
   ```bash
   pnpm db:push
   ```

2. Créer l'utilisateur administrateur :
   ```bash
   ./reset-admin-sql.sh
   ```

3. Redémarrer l'application :
   ```bash
   sudo systemctl restart formation-manager
   ```

---

### Cause 4 : Problème de hashage du mot de passe

**Symptôme** : L'utilisateur existe mais le mot de passe ne fonctionne pas

**Solution** :

Réinitialiser le mot de passe :

```bash
./reset-admin-sql.sh
```

Le script va détecter que l'utilisateur existe et mettre à jour uniquement le mot de passe.

---

### Cause 5 : La dépendance bcryptjs n'est pas installée

**Symptôme** : Erreur dans les logs : `Cannot find module 'bcryptjs'`

**Solution** :

1. Réinstaller les dépendances :
   ```bash
   pnpm install
   ```

2. Vérifier que bcryptjs est installé :
   ```bash
   ls node_modules/bcryptjs
   ```

3. Redémarrer l'application :
   ```bash
   sudo systemctl restart formation-manager
   ```

---

### Cause 6 : La dépendance jsonwebtoken n'est pas installée

**Symptôme** : Erreur dans les logs : `Cannot find module 'jsonwebtoken'`

**Solution** :

1. Installer jsonwebtoken :
   ```bash
   pnpm install jsonwebtoken
   ```

2. Redémarrer l'application :
   ```bash
   sudo systemctl restart formation-manager
   ```

---

## Vérification manuelle de la base de données

Si les scripts ne fonctionnent pas, vous pouvez vérifier manuellement la base de données.

### 1. Se connecter à MySQL

```bash
mysql -u root -p
```

### 2. Sélectionner la base de données

```sql
USE formation_manager;
```

### 3. Vérifier que la table users existe

```sql
SHOW TABLES;
```

Vous devriez voir `users` dans la liste.

### 4. Vérifier l'utilisateur adminServFormation

```sql
SELECT username, email, role, isActive, password FROM users WHERE username = 'adminServFormation';
```

**Résultat attendu** :
```
+--------------------+------------------------+-------+----------+--------------------------------------------------------------+
| username           | email                  | role  | isActive | password                                                     |
+--------------------+------------------------+-------+----------+--------------------------------------------------------------+
| adminServFormation | admin@formation.local  | admin |        1 | $2a$10$... (hash bcrypt)                                     |
+--------------------+------------------------+-------+----------+--------------------------------------------------------------+
```

### 5. Si l'utilisateur n'existe pas, le créer manuellement

```sql
-- Générer un hash bcrypt pour "Itinova69!"
-- Utiliser le script reset-admin.sh est recommandé, mais voici la méthode manuelle

-- Insérer l'utilisateur (remplacer le hash par celui généré)
INSERT INTO users (username, password, email, name, role, isActive, createdAt, updatedAt)
VALUES (
  'adminServFormation',
  '$2a$10$YourHashedPasswordHere',
  'admin@formation.local',
  'Administrateur',
  'admin',
  1,
  NOW(),
  NOW()
);
```

**Note** : Il est fortement recommandé d'utiliser le script `reset-admin.sh` plutôt que de créer l'utilisateur manuellement.

---

## Vérification des logs

### Logs de l'application (systemd)

```bash
sudo journalctl -u formation-manager -n 100 --no-pager
```

Recherchez les erreurs liées à :
- `JWT_SECRET`
- `bcryptjs`
- `jsonwebtoken`
- `Database connection`

### Logs de l'application (développement)

Si vous exécutez l'application avec `pnpm dev`, les logs s'affichent directement dans le terminal.

Recherchez les messages d'erreur lors de la tentative de connexion.

---

## Procédure complète de réinitialisation

Si rien ne fonctionne, suivez cette procédure complète :

### 1. Vérifier la configuration

```bash
cd /chemin/vers/formation-manager-itinova
cat .env
```

Vérifiez que les variables suivantes sont définies :
- `DATABASE_URL`
- `JWT_SECRET`

### 2. Vérifier la connexion à la base de données

```bash
mysql -h localhost -u votre_utilisateur -p formation_manager -e "SELECT 1;"
```

### 3. Réinstaller les dépendances

```bash
rm -rf node_modules
pnpm install
```

### 4. Réinitialiser la base de données (⚠️ ATTENTION : supprime toutes les données)

```bash
# Sauvegarder d'abord
mysqldump -u root -p formation_manager > backup_avant_reset.sql

# Recréer la base de données
mysql -u root -p -e "DROP DATABASE IF EXISTS formation_manager;"
mysql -u root -p -e "CREATE DATABASE formation_manager CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# Appliquer les migrations
pnpm db:push
```

### 5. Créer l'utilisateur administrateur

```bash
./reset-admin.sh
```

### 6. Redémarrer l'application

```bash
sudo systemctl restart formation-manager
```

### 7. Tester la connexion

Ouvrir http://votre-domaine.com et se connecter avec :
- **Identifiant** : adminServFormation
- **Mot de passe** : Itinova69!

---

## Problèmes persistants

Si le problème persiste après avoir suivi toutes ces étapes :

### 1. Vérifier les permissions des fichiers

```bash
# Corriger les permissions
sudo chown -R votre_utilisateur:votre_groupe /chemin/vers/formation-manager-itinova
chmod -R 755 /chemin/vers/formation-manager-itinova
```

### 2. Vérifier la version de Node.js

```bash
node -v
```

Version requise : **22.13.0 ou supérieure**

Si la version est inférieure :
```bash
# Installer Node.js 22
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
```

### 3. Vérifier la version de MySQL

```bash
mysql --version
```

Version requise : **MySQL 8.0+ ou MariaDB 10.6+**

### 4. Activer les logs de débogage

Ajouter dans `.env` :
```env
DEBUG=*
NODE_ENV=development
```

Redémarrer et consulter les logs détaillés.

---

## Scripts de dépannage disponibles

| Script | Description | Utilisation |
|--------|-------------|-------------|
| `diagnose.sh` | Diagnostic complet de la configuration | `./diagnose.sh` |
| `reset-admin-sql.sh` | Réinitialisation de l'utilisateur admin | `./reset-admin-sql.sh` |
| `deploy.sh` | Déploiement complet avec sauvegarde | `./deploy.sh` |

---

## Contacts et support

Si vous avez suivi toutes les étapes et que le problème persiste :

1. Exécuter le diagnostic complet :
   ```bash
   ./diagnose.sh > diagnostic_$(date +%Y%m%d_%H%M%S).txt
   ```

2. Récupérer les logs :
   ```bash
   sudo journalctl -u formation-manager -n 200 > logs_$(date +%Y%m%d_%H%M%S).txt
   ```

3. Contacter l'équipe de développement avec :
   - Le fichier de diagnostic
   - Les logs de l'application
   - La description détaillée du problème

---

**Dernière mise à jour** : 23 novembre 2025
