# UI

## C'est quoi l'UI ?

C'est la porte d'entrée du système. C'est ici que les requêtes HTTP arrivent, sont validées, puis transmises aux Use Cases.

L'UI ne contient aucune logique métier — elle reçoit, valide, transmet, et retourne une réponse. C'est tout.

> L'UI ne sait pas comment fonctionne le métier. Elle sait juste quoi recevoir, à qui le transmettre, et quoi retourner.

---

## Structure

```
UI/
├── Api/          → Points d'entrée pour les utilisateurs du SaaS (JSON)
│   ├── Controller/ → Controllers des routes API
│   └── Request/    → Validation des données entrantes
└── Back/         → Points d'entrée pour le superadmin (interface web)
    ├── Controller/ → Controllers du back-office
    └── Request/    → Validation des données entrantes
```

---

## `Api/`

**Rôle** : expose les fonctionnalités du SaaS sous forme d'API JSON. C'est ce que consomment les utilisateurs connectés — via une app front, mobile, ou tout autre client HTTP.

**Toutes les routes commencent par** `/api/`.

### `Api/Controller/`

**Rôle** : reçoit la requête HTTP, crée le Command, appelle le Use Case, retourne la réponse JSON.

**Un controller ne fait que ça — jamais de logique métier dedans.**

### `Api/Controller/Auth/`

| Fichier | Route | Rôle |
|---|---|---|
| `AuthController.php` | `POST /api/auth/login` | Connexion — retourne un token JWT |
| `AuthController.php` | `POST /api/auth/register` | Inscription — crée un compte et retourne un token JWT |

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `OAuthController.php` | `GET /api/auth/oauth/{provider}` | Redirige vers Google, Facebook, LinkedIn |

### `Api/Controller/Project/`

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `ProjectController.php` | `GET /api/projects` | Liste les projets de l'utilisateur connecté |
| `ProjectController.php` | `POST /api/projects` | Crée un nouveau projet |
| `ProjectController.php` | `GET /api/projects/{id}` | Récupère un projet |
| `ProjectController.php` | `PUT /api/projects/{id}` | Modifie un projet |
| `ProjectController.php` | `DELETE /api/projects/{id}` | Supprime un projet |

### `Api/Controller/Module/`

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `ModuleController.php` | `POST /api/projects/{id}/modules` | Ajoute un module à un projet |
| `ModuleController.php` | `PUT /api/modules/{id}` | Modifie un module |
| `ModuleController.php` | `DELETE /api/modules/{id}` | Supprime un module |

### `Api/Controller/Export/`

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `ExportController.php` | `GET /api/projects/{id}/export/pdf` | Exporte un projet en PDF |
| `ExportController.php` | `GET /api/projects/{id}/export/word` | Exporte un projet en Word |

### `Api/Controller/History/`

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `HistoryController.php` | `GET /api/projects/{id}/history` | Récupère l'historique d'un projet |

---

### `Api/Request/`

**Rôle** : valide les données JSON entrantes avant de les transmettre au Use Case. Si les données sont invalides, on retourne une erreur 400 sans même appeler le Use Case.

**Comment ça fonctionne** : chaque `Request` utilise les annotations Symfony Validator (`#[Assert\NotBlank]`, `#[Assert\Email]`...) pour définir les règles de validation.

### `Api/Request/Auth/`

| Fichier | Champs obligatoires |
|---|---|
| `LoginRequest.php` | `email`, `password` |
| `RegisterRequest.php` | `prenom`, `nom`, `email`, `password` |

**À créer :**

| Fichier | Valide |
|---|---|
| `OAuthRequest.php` | Le provider OAuth (`google`, `facebook`, `linkedin`) |

### `Api/Request/Project/`

**À créer :**

| Fichier | Valide |
|---|---|
| `CreateProjectRequest.php` | Les données de création d'un projet |
| `UpdateProjectRequest.php` | Les données de modification d'un projet |

### `Api/Request/Module/`

**À créer :**

| Fichier | Valide |
|---|---|
| `CreateModuleRequest.php` | Les données de création d'un module |
| `UpdateModuleRequest.php` | Les données de modification d'un module |

---

## `Back/`

**Rôle** : interface web réservée au superadmin. Contrairement à l'API qui retourne du JSON, le back-office retourne des vues HTML (Twig).

**Toutes les routes commencent par** `/back/`.

> Ces routes ne sont jamais accessibles aux utilisateurs normaux — protégées par le firewall Symfony et la vérification du rôle `superadmin`.

### `Back/Controller/Auth/`

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `AdminAuthController.php` | `GET/POST /back/login` | Connexion superadmin |
| `AdminAuthController.php` | `GET/POST /back/2fa` | Vérification du code 2FA |

### `Back/Controller/User/`

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `UserController.php` | `GET /back/users` | Liste tous les utilisateurs |
| `UserController.php` | `GET /back/users/{id}` | Détail d'un utilisateur |
| `UserController.php` | `POST /back/users/{id}/block` | Bloque un utilisateur |
| `UserController.php` | `POST /back/users/{id}/unblock` | Réactive un utilisateur |
| `UserController.php` | `DELETE /back/users/{id}` | Supprime un utilisateur |

### `Back/Controller/Project/`

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `ProjectController.php` | `GET /back/projects` | Liste tous les projets |
| `ProjectController.php` | `DELETE /back/projects/{id}` | Supprime un projet (modération) |

### `Back/Controller/Settings/`

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `SettingsController.php` | `GET/POST /back/settings` | Paramètres globaux de l'application |

### `Back/Controller/Log/`

**À créer :**

| Fichier | Route | Rôle |
|---|---|---|
| `LogController.php` | `GET /back/logs` | Consultation des logs système |

---

### `Back/Request/`

**À créer :**

| Fichier | Valide |
|---|---|
| `Auth/AdminLoginRequest.php` | Les données de connexion admin |
| `User/BlockUserRequest.php` | La raison du blocage |
| `Project/DeleteProjectRequest.php` | La confirmation de suppression |

---

## Règles à respecter

- Un controller ne contient jamais de logique métier
- On valide toujours les données via un `Request` avant d'appeler le Use Case
- Les controllers `Api/` retournent toujours du JSON
- Les controllers `Back/` retournent toujours des vues Twig
- Les routes `Api/` et `Back/` ne se mélangent jamais