# Backend PHP/MySQL — étape 2

## État livré

Le backend définitif destiné à OVH est isolé dans `php/`. Il n'est pas encore
branché sur l'interface React : l'application Next actuelle continue donc de
fonctionner sans changement.

Architecture :

```text
php/
├── bootstrap.php
├── config/config.example.php
├── schema.sql
├── public/
│   ├── .htaccess
│   └── api/index.php
├── src/
│   ├── Application.php
│   ├── EventData.php
│   ├── EventRepository.php
│   ├── PdoEventRepository.php
│   ├── ImageStorage.php
│   ├── DiskImageStorage.php
│   ├── EmailSender.php
│   ├── PhpMailSender.php
│   └── HttpResponse.php
├── storage/images/.htaccess
└── tests/run.php
```

## Compatibilité API

`Application` accepte exactement les routes utiles au frontend :

- `GET|POST /api/events`
- `GET|PATCH|DELETE /api/manage/{token}`
- `POST /api/uploads`
- `GET /api/images/{key}`

Le futur frontend statique pourra continuer à utiliser ses `fetch()` actuels en
same-origin. Aucun préfixe, port, domaine ou format de réponse supplémentaire
n'est introduit.

## MySQL

- PHP PDO avec `ATTR_EMULATE_PREPARES=false`.
- Base neuve dédiée.
- Une table `events`.
- InnoDB et `utf8mb4`.
- Index uniques sur `slug` et `management_token`.
- Index de tri sur `created_at`.
- Lecture par slug disponible pour le rendu PHP public de l'étape 3.

Il n'existe aucun import, convertisseur ou outil de migration de données dans le
backend PHP. Les anciens scripts TypeScript appartiennent uniquement à
l'historique du prototype Next et seront exclus du paquet OVH.

## Images

- Stockage hors racine publique.
- Accès uniquement par `/api/images/{key}`.
- JPEG, PNG et WebP.
- 5 Mo maximum.
- Vérification `fileinfo` et `getimagesize`.
- Noms aléatoires générés côté serveur.
- Interdiction d'exécution par `.htaccess`.
- Suppression physique avec l'événement.

## E-mail

`PhpMailSender` utilise la fonction PHP `mail()` disponible sur l'hébergement :

- expéditeur configurable ;
- corps HTML UTF-8 ;
- objet MIME UTF-8 ;
- protection contre les retours à la ligne dans les adresses et en-têtes ;
- échec d'envoi retourné par `emailSent: false`.

Aucun e-mail réel n'est envoyé par les tests.

## Configuration

`config/config.example.php` ne contient aucun secret réel. Sur OVH, il faudra le
copier en `config/config.php`, fichier ignoré par Git, puis renseigner :

- DSN MySQL ;
- utilisateur et mot de passe dédiés ;
- URL publique ;
- chemin de stockage ;
- expéditeur e-mail.

## Contrôles de l'étape

Les tests PHP utilisent des doubles en mémoire. Ils vérifient les contrats HTTP,
la validation, les slugs, les jetons, la gestion, les images et le schéma sans
connexion externe.

Le schéma n'a pas été exécuté sur l'instance OVH, conformément à l'interdiction
de toucher à la production. Son test d'intégration sur MySQL 8 devra être
effectué sur une base locale ou de recette avant tout déploiement.
