# Export et sauvegarde des données XAMXAM

Ce document explique le fonctionnement du système d'export pour les
administrateur·ices de la plateforme. Il couvre les trois types d'export
disponibles depuis le panneau d'administration, la manière de les combiner
pour une restauration complète, et les détails techniques utiles en cas de
problème.

---

## Les trois exports disponibles

Depuis la page principale d'administration (`/admin/`), la barre d'outils
propose trois boutons d'export :

| Bouton | Fichier produit | Contenu |
|---|---|---|
| **Exporter CSV** | `xamxam-export-AAAA-MM-JJ.csv` | Liste complète des TFE au format compatible avec l'import CSV |
| **Exporter DB** | `xamxam-db-AAAA-MM-JJ.sqlite` | Copie brute du fichier de base de données SQLite |
| **Exporter fichiers** | `xamxam-files-AAAA-MM-JJ.zip` | Archive ZIP contenant tous les fichiers attachés aux TFE + un manifeste JSON |

---

## Exporter les fichiers (ZIP)

### Ce que contient l'archive

```
xamxam-files-2026-05-07.zip
├── manifest.json        ← métadonnées de chaque TFE et ses fichiers
└── files/
    └── theses/
        ├── 2025/
        │   ├── 2025_EMMA_RENARD/
        │   │   └── EMMA_RENARD_carte_loire_a_velo_france.pdf
        │   ├── 2025_LILA_DUBOIS_KARIM_NASSAR/
        │   │   ├── nixing_the_fix_report_final.pdf
        │   │   ├── bbb_sunflower_1080p_30fps_normal_mp4.zip
        │   │   └── carte_loire_a_velo_france.pdf
        │   └── …
        └── 2026/
            └── …
```

### Le fichier `manifest.json`

```json
{
  "exported_at": "2026-05-07T15:30:00+02:00",
  "db_file": "xamxam.db",
  "total_theses": 140,
  "total_files": 312,
  "zip_added_count": 310,
  "zip_skipped_count": 2,
  "theses": {
    "2025-003": {
      "id": 42,
      "identifier": "2025-003",
      "title": "Titre du TFE",
      "year": 2025,
      "files": [
        {
          "type": "main",
          "path": "theses/2025/2025_AUTEUR/mon_fichier.pdf",
          "name": "mon_fichier.pdf",
          "size": 1234567,
          "mime": "application/pdf",
          "hash": null,
          "label": "Mémoire principal",
          "sort_order": 1
        }
      ]
    }
  }
}
```

Le manifeste fait le **pont entre la base de données et les fichiers**. Chaque
TFE est indexé par son identifiant (ex. `2025-003`), ce qui permet de
retrouver ses fichiers même si l'ordre des IDs change après une restauration.

---

## Restaurer une sauvegarde complète

Une sauvegarde complète se compose de **trois fichiers** à exporter le même
jour (DB + fichiers ZIP + CSV). Voici la procédure de restauration sur un
serveur neuf ou après un incident.

### 1. Restaurer la base de données

```bash
# Arrêter le serveur web
sudo systemctl stop nginx

# Remplacer le fichier SQLite
cp xamxam-db-AAAA-MM-JJ.sqlite /var/www/xamxam/storage/xamxam.db
chown www-data:www-data /var/www/xamxam/storage/xamxam.db
chmod 640 /var/www/xamxam/storage/xamxam.db
```

### 2. Restaurer les fichiers

```bash
# Décompresser l'archive dans le répertoire storage/
# ATTENTION : le zip contient un dossier files/ à la racine.
# On le décompresse dans /tmp puis on copie le contenu de files/theses/
# dans storage/theses/ pour préserver la structure existante.

unzip xamxam-files-AAAA-MM-JJ.zip -d /tmp/xamxam-restore
cp -r /tmp/xamxam-restore/files/theses/* /var/www/xamxam/storage/theses/
chown -R www-data:www-data /var/www/xamxam/storage/theses/
rm -rf /tmp/xamxam-restore
```

> **Pourquoi ça fonctionne :** les chemins dans la table `thesis_files` sont
> relatifs (ex. `theses/2025/2025_AUTEUR/fichier.pdf`). En restaurant les
> fichiers au même emplacement sous `storage/`, les liens DB ↔ fichiers sont
> automatiquement rétablis.

### 3. Redémarrer

```bash
sudo systemctl start nginx
```

### 4. Vérifier

Naviguer vers `/admin/` et vérifier que la liste des TFE s'affiche
correctement et que les fichiers sont téléchargeables.

---

## Restauration partielle ou re-linkage

Si la base de données a été perdue mais que vous avez le ZIP des fichiers
et le CSV d'export, vous pouvez reconstruire les liens grâce au
`manifest.json` :

1. **Réimporter le CSV** via l'interface d'administration (bouton *Importer un
   CSV*). Les identifiants (colonne `Identifiant`) doivent correspondre à ceux
   du manifeste.

2. **Décompresser le ZIP** dans `storage/` comme décrit ci-dessus.

3. **Vérifier avec le manifeste** — les chemins dans `manifest.json`
   correspondent aux chemins dans `thesis_files.file_path`. Si les
   identifiants du CSV et ceux du manifeste coïncident, les fichiers seront
   correctement liés après l'import.

---

## Détails techniques

### Performance

L'export des fichiers utilise `ZipArchive` (extension PHP standard) et crée
une archive temporaire dans `/tmp`. Pour un volume important de fichiers
(plusieurs centaines), la création peut prendre quelques secondes. Un timeout
d'exécution raisonnable (`max_execution_time ≥ 60s`) est recommandé.

### Sécurité

- Les exports sont **protégés par authentification administrateur**
  (`AdminAuth::requireLogin()`).
- L'export DB et l'export fichiers sont journalisés dans le log d'audit
  (`admin_audit_log`) avec l'IP et l'User-Agent de l'administrateur.
- Les fichiers temporaires sont supprimés après envoi (`unlink()` dans le
  bloc `finally` implicite de `export-files.php`).
- Les fichiers dans le ZIP conservent leurs chemins relatifs d'origine — il
  n'y a pas de risque de *path traversal* car les chemins proviennent de la
  base de données et ne contiennent jamais `../`.

### Colonnes du CSV d'export

Le CSV utilise la même structure que l'import (21 colonnes). Il est
directement ré-importable sans modification. Voir [`docs/import.md`](import.md)
pour le détail des colonnes.

---

## Résumé des commandes utiles

```bash
# Télécharger les trois exports (depuis le navigateur ou curl)
curl -u admin:password -O https://xamxam.erg.be/admin/actions/export-db.php
curl -u admin:password -O https://xamxam.erg.be/admin/actions/export-csv.php
curl -u admin:password -O https://xamxam.erg.be/admin/actions/export-files.php

# Restauration complète
sudo systemctl stop nginx
cp xamxam-db-*.sqlite /var/www/xamxam/storage/xamxam.db
unzip xamxam-files-*.zip -d /tmp/xamxam-restore
cp -r /tmp/xamxam-restore/files/theses/* /var/www/xamxam/storage/theses/
chown -R www-data:www-data /var/www/xamxam/storage/
sudo systemctl start nginx
```
