# Micro-service d'upload PHP — Installation

## Architecture

Un micro-service PHP séparé cohabite avec votre front React et votre PostgREST.
Il gère 3 opérations :

```
Front React  ─(multipart)─▶  PHP upload.php    ─▶  /public/uploads/sinistres/2026/04/xxxx.pdf
                                    │
                                    ▼
                             Retourne le chemin
                                    │
Front React  ─(RPC)─▶  PostgREST ─▶ app.declarer_sinistre_avec_pieces()
                                    │
                                    ▼
                             stockage.documents(chemin_fichier, ...)
```

## Installation

### 1. Déposer les fichiers PHP

Copier le dossier `api-upload/` à la racine de votre projet, au même niveau que
`public/` :

```
votre-projet/
├── api-upload/
│   ├── config.php
│   ├── auth.php
│   ├── upload.php
│   ├── telecharger.php
│   ├── apercu.php
│   └── .htaccess
├── public/
│   └── uploads/          ← Créer ce dossier
│       └── .htaccess     ← Copier public-uploads-htaccess.txt ici
└── src/
```

### 2. Créer le dossier de stockage

```bash
mkdir -p public/uploads/sinistres
chmod -R 755 public/uploads
# Sur production : donner les droits d'écriture au user du serveur web (www-data, apache, nginx)
chown -R www-data:www-data public/uploads
```

### 3. Configurer `api-upload/config.php`

**⚠️ Trois paramètres critiques à adapter :**

```php
// MÊME secret que dans votre postgrest.conf (directive jwt-secret)
'jwt_secret' => 'votre-secret-identique-a-postgrest',

// Identifiants de la base (read-only minimum pour telecharger.php)
'db' => [
    'host'     => 'localhost',
    'dbname'   => 'assur_suite',
    'user'     => 'app_user',
    'password' => 'votre-mot-de-passe',
],

// Origines front autorisées (CORS)
'cors_origins' => [
    'http://localhost:5173',
    'https://votre-domaine-production.com',
],
```

### 4. Configurer le serveur web

**Option A : Apache** — les `.htaccess` fournis suffisent

**Option B : Nginx** — ajouter dans votre config :

```nginx
# Interdire l'exécution PHP dans uploads
location ^~ /uploads/ {
    location ~ \.php$ { deny all; }
}

# Bloquer config.php et auth.php
location ~ ^/api-upload/(config|auth)\.php$ {
    deny all;
    return 403;
}
```

### 5. Variable d'environnement côté front

Dans `.env` à la racine de votre projet Vite :

```
VITE_URL_API_UPLOAD=/api-upload
```

En production, selon votre setup :
```
VITE_URL_API_UPLOAD=https://votre-domaine.com/api-upload
```

## Tester

### 1. Tester l'upload sans front (curl)

```bash
# Récupérer un JWT valide depuis votre app, puis :
curl -X POST "http://localhost/api-upload/upload.php?type=sinistre" \
  -H "Authorization: Bearer <VOTRE_JWT>" \
  -F "fichier=@/chemin/vers/test.pdf"
```

Réponse attendue :
```json
{
  "chemin_fichier": "/uploads/sinistres/2026/04/abcdef123.pdf",
  "nom_fichier": "abcdef123.pdf",
  "nom_original": "test.pdf",
  "type_mime": "application/pdf",
  "taille_octets": 12345,
  "empreinte_sha256": "..."
}
```

### 2. Vérifier que le fichier est bien écrit

```bash
ls -la public/uploads/sinistres/2026/04/
```

## Sécurité

Le système met en place plusieurs couches :

1. **Authentification JWT obligatoire** sur upload/télécharger/aperçu
2. **Extensions whitelistées** (pdf, jpg, png, doc, zip)
3. **Taille max** configurable (15 Mo par défaut)
4. **Validation MIME réelle** (pas juste celle déclarée par le client)
5. **Noms de fichiers aléatoires** (pas de chemin traversé possible)
6. **Exécution PHP désactivée** dans `/uploads` via `.htaccess`
7. **RLS PostgreSQL respectée** lors du téléchargement (le PHP injecte l'identité
   de l'utilisateur via `SET LOCAL request.jwt.claims`)

## Limites à connaître

- **PHP `upload_max_filesize`** et **`post_max_size`** : vérifiez dans `php.ini`
  qu'ils sont ≥ 15M (adapter selon votre config)
- **Aperçu dans le navigateur** : seuls les PDF et images s'affichent inline.
  Les autres formats (docx, zip) déclenchent un téléchargement.
- **Token dans l'URL** : pour l'aperçu, on utilise axios + blob URL pour éviter
  de passer le JWT dans la query string (plus sécurisé).
