# Capsulize Backend (PHP 7)

Backend minimal pour l’authentification par **code e-mail** (OTP) avec **session serveur**.

## Endpoints

- `POST /auth/request-code` `{ "email": "..." }`
- `POST /auth/verify-code` `{ "email": "...", "code": "123456" }`
- `GET /me`
- `POST /auth/logout`

## Variables d’environnement

- `MYSQL_URI` (URL MySQL, ex. `mysql://user:pass@host:3306/dbname`)
- `MYSQL_CHARSET` (optionnel, défaut `utf8mb4`)
- `CORS_ALLOWED_ORIGINS` (CSV, ex. `http://localhost:4200,https://www.capsulize.app`)
- `API_PREFIX` (optionnel, ex. `/api` si monté derrière un reverse proxy — par défaut le backend accepte aussi `/api/...`)
- `AUTH_CODE_SECRET` (obligatoire en prod)
- `SESSION_COOKIE_NAME` (optionnel)
- `SESSION_COOKIE_DOMAIN` (optionnel, ex. `.capsulize.app` si besoin multi-sous-domaines)
- `SESSION_COOKIE_SAMESITE` (optionnel, défaut `Lax`)
- `SESSION_SAVE_PATH` (optionnel)

### Option C — fichier `backend-php7/.env`

Le backend charge automatiquement le fichier `backend-php7/.env` au démarrage (si présent). Exemple:

```bash
CORS_ALLOWED_ORIGINS=https://testament.capsulize.app
AUTH_CODE_SECRET=CHANGE_ME_LONG_RANDOM
RESEND_API_KEY=re_xxx
RESEND_FROM="Capsulize <noreply@capsulize.app>"
MYSQL_URI=mysql://user:pass@host:3306/dbname
MYSQL_CHARSET=utf8mb4
```

Sur le serveur, pense à sécuriser le fichier:

```bash
sudo chown www-data:www-data /var/www/.../backend-php7/.env
sudo chmod 600 /var/www/.../backend-php7/.env
```

## Migrations

Voir `migrations/` (à appliquer sur MySQL).

## Cron (purge capsules non payées)

Toute capsule **non payée** est supprimée automatiquement au bout d'**1 mois** (hard-delete en base).

- Script: `scripts/purge_unpaid_capsules.php`
- Exécution manuelle:

```bash
php scripts/purge_unpaid_capsules.php
```

- Exemple crontab (tous les jours à 03:00):

```bash
0 3 * * * php /var/www/.../backend-php7/scripts/purge_unpaid_capsules.php >> /var/log/capsulize-cron.log 2>&1
```

Note: le script supprime les lignes en base (`capsules`, `capsule_assets`) et tente aussi de supprimer les objets S3/Cellar (best-effort). Les résultats (OK/HTTP status) sont logués.

