# API de Gestion des Fichiers - Geosector

## Vue d'ensemble

L'API de gestion des fichiers permet aux administrateurs de naviguer, rechercher et gérer les fichiers stockés dans l'application Geosector avec des contrôles d'accès basés sur les rôles.

## Contrôles d'accès

### Rôle 2 (Admin d'entité)

- Accès limité aux fichiers de son entité uniquement
- Chemin racine : `/uploads/entites/{son_entite_id}/`
- Peut naviguer dans tous les sous-dossiers de son entité

### Rôle > 2 (Super admin)

- Accès complet à tous les fichiers
- Chemin racine : `/uploads/` (accès total)
- Peut naviguer dans toutes les entités et dossiers système

## Routes disponibles

### Navigation et listing

#### `GET /api/files/browse`

Navigation dans l'arborescence avec recherche et pagination.

**Paramètres de requête :**

- `path` (string) : Chemin à explorer (ex: `entites/5/operations`)
- `page` (int) : Page (défaut: 1)
- `per_page` (int) : Éléments par page (défaut: 50, max: 100)
- `search` (string) : Recherche dans nom, nom original, description
- `type` (string) : Filtrage par extension (pdf, jpg, xlsx, etc.)
- `category` (string) : Filtrage par catégorie métier
- `sort` (string) : Tri (name, date, size, type) - défaut: date
- `order` (string) : Ordre (asc, desc) - défaut: desc

**Exemple :**

```bash
GET /api/files/browse?path=entites/5/operations&search=2024&type=xlsx&page=1
```

**Réponse :**

```json
{
  "status": "success",
  "current_path": "entites/5/operations",
  "parent_path": "entites/5",
  "pagination": {
    "current_page": 1,
    "per_page": 50,
    "total_items": 127,
    "total_pages": 3,
    "has_next": true,
    "has_prev": false
  },
  "filters": {
    "search": "2024",
    "type": "xlsx",
    "category": null,
    "sort": "date",
    "order": "desc"
  },
  "files": [
    {
      "id": 123,
      "fichier": "planning_2024_op2644.xlsx",
      "original_name": "Planning Opération 2024.xlsx",
      "file_type": "xlsx",
      "file_category": "planning",
      "description": "Planning détaillé opération 2024",
      "file_size": 1024000,
      "file_path": "entites/5/operations/2644/documents/planning_2024_op2644.xlsx",
      "created_at": "2025-06-22 08:30:00",
      "creator_name": "Jean Dupont"
    }
  ],
  "summary": {
    "total_files": 45,
    "total_size": 25600000,
    "by_category": {
      "planning": 12,
      "export": 20,
      "backup": 13
    }
  }
}
```

#### `GET /api/files/list/{support}/{id}`

Liste des fichiers par support (entite, user, operation, passage).

**Paramètres :**

- `support` : Type de support (entite, user, operation, passage)
- `id` : ID de l'élément
- Mêmes paramètres de requête que `/browse`

**Exemple :**

```bash
GET /api/files/list/operation/2644?category=export&page=1
```

### Recherche

#### `GET /api/files/search`

Recherche globale dans tous les fichiers accessibles.

**Paramètres de requête :**

- `q` (string, requis) : Terme de recherche
- `page`, `per_page`, `type`, `category`, `sort`, `order` : Mêmes que browse

**Exemple :**

```bash
GET /api/files/search?q=planning&type=xlsx&category=planning
```

### Actions sur fichiers

#### `GET /api/files/download/{id}`

Téléchargement sécurisé d'un fichier.

**Réponse :** Fichier en téléchargement direct avec headers appropriés.

#### `DELETE /api/files/{id}`

Suppression sécurisée d'un fichier (physique + base de données).

**Réponse :**

```json
{
  "status": "success",
  "message": "Fichier supprimé avec succès"
}
```

#### `GET /api/files/info/{id}`

Informations détaillées d'un fichier.

**Réponse :**

```json
{
  "status": "success",
  "file": {
    "id": 123,
    "fichier": "planning_2024.xlsx",
    "original_name": "Planning Opération 2024.xlsx",
    "file_type": "xlsx",
    "file_category": "planning",
    "file_size": 1024000,
    "mime_type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    "description": "Planning détaillé",
    "support": "operation",
    "support_id": 2644,
    "fk_entite": 5,
    "created_at": "2025-06-22 08:30:00",
    "updated_at": "2025-06-22 08:30:00",
    "creator_name": "Jean Dupont",
    "modifier_name": null,
    "file_exists": true
  }
}
```

### Statistiques

#### `GET /api/files/stats`

Statistiques d'utilisation des fichiers.

**Pour admin d'entité (rôle 2) :**

```json
{
  "status": "success",
  "entite_id": 5,
  "storage": {
    "total_files": 245,
    "total_size": 157286400,
    "by_support": {
      "entite": { "count": 12, "size": 45000000 },
      "operation": { "count": 180, "size": 98000000 },
      "user": { "count": 45, "size": 12000000 },
      "passage": { "count": 8, "size": 2286400 }
    },
    "by_category": {
      "document": 25,
      "export": 120,
      "avatar": 45,
      "photo": 55
    },
    "by_type": {
      "xlsx": 85,
      "jpg": 120,
      "pdf": 40
    }
  }
}
```

**Pour super admin (rôle > 2) :**

```json
{
  "status": "success",
  "global_stats": {
    "total_files": 2450,
    "total_size": 1572864000,
    "entites_count": 25,
    "by_entite": [
      { "entite_id": 5, "files": 245, "size": 157286400 },
      { "entite_id": 12, "files": 180, "size": 98000000 }
    ]
  }
}
```

### Métadonnées

#### `GET /api/files/metadata`

Informations sur les catégories, extensions et limites autorisées.

**Réponse :**

```json
{
  "status": "success",
  "categories": {
    "entite": ["logo", "document", "reglement", "statut"],
    "user": ["avatar", "photo"],
    "operation": ["planning", "liste", "export", "backup"],
    "passage": ["recu", "photo", "justificatif", "carte"]
  },
  "extensions": ["pdf", "jpg", "jpeg", "png", "gif", "webp", "xlsx", "xls", "json", "csv"],
  "mime_types": {
    "pdf": "application/pdf",
    "jpg": "image/jpeg",
    "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
  },
  "max_file_sizes": {
    "entite": 20971520, // 20 MB
    "user": 5242880, // 5 MB
    "operation": 20971520, // 20 MB
    "passage": 10485760 // 10 MB
  }
}
```

## Catégories de fichiers

### Distinction Extension vs Catégorie

- **Extension** (`file_type`) : Type technique (pdf, jpg, xlsx, png, etc.)
- **Catégorie** (`file_category`) : Type métier (logo, carte, photo, document, planning, etc.)

### Catégories par support

#### Entité

- `logo` : Logo de l'entité
- `document` : Documents généraux
- `reglement` : Règlements internes
- `statut` : Statuts de l'entité

#### Utilisateur

- `avatar` : Photo de profil
- `photo` : Photos diverses

#### Opération

- `planning` : Plannings d'opération
- `liste` : Listes diverses
- `export` : Exports de données
- `backup` : Sauvegardes automatiques

#### Passage

- `recu` : Reçus de passage
- `photo` : Photos de passage
- `justificatif` : Justificatifs divers
- `carte` : Cartes et plans

## Sécurité

### Validation des chemins

- Empêche les traversées de répertoire (`../`)
- Validation stricte selon le rôle utilisateur
- Contrôle d'accès au niveau fichier

### Logs

- Tous les téléchargements sont loggés
- Toutes les suppressions sont tracées
- Erreurs d'accès enregistrées

### Contrôles d'intégrité

- Vérification de l'existence physique des fichiers
- Validation des permissions avant chaque action
- Contrôle de cohérence base/fichiers

## Exemples d'utilisation

### Navigation dans les opérations d'une entité

```bash
GET /api/files/browse?path=entites/5/operations&sort=name&order=asc
```

### Recherche de tous les exports Excel

```bash
GET /api/files/search?q=export&type=xlsx&category=export
```

### Statistiques de stockage

```bash
GET /api/files/stats
```

### Téléchargement d'un fichier

```bash
GET /api/files/download/123
```

### Suppression d'un fichier

```bash
DELETE /api/files/123
```

## Codes d'erreur

- **401** : Non authentifié
- **403** : Accès refusé (rôle insuffisant ou fichier d'une autre entité)
- **404** : Fichier ou chemin non trouvé
- **400** : Paramètres invalides (terme de recherche manquant, etc.)
- **500** : Erreur serveur

## Migration base de données

Pour utiliser le système, exécuter la migration :

```sql
-- Ajout de la colonne file_category
ALTER TABLE `medias`
ADD COLUMN `file_category` varchar(50) DEFAULT NULL COMMENT 'Catégorie du fichier (logo, carte, photo, document, etc.)' AFTER `file_type`;

-- Index pour optimiser les requêtes
ALTER TABLE `medias`
ADD INDEX `idx_file_category` (`file_category`);
```

---

**Version** : 1.0  
**Date** : Juin 2025  
**Auteur** : API Geosector Team
