# Backend Laravel - SAR

## 📋 Prérequis

- PHP >= 8.1
- Composer
- MySQL >= 5.7 ou MariaDB >= 10.3
- Extensions PHP requises :
  - OpenSSL
  - PDO
  - Mbstring
  - Tokenizer
  - XML
  - Ctype
  - JSON
  - BCMath
  - Fileinfo

## 🚀 Installation

1. **Installer les dépendances :**
```bash
composer install
```

2. **Configurer l'environnement :**
```bash
cp .env.example .env
php artisan key:generate
```

3. **Configurer la base de données MySQL dans `.env` :**
```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sar_db
DB_USERNAME=root
DB_PASSWORD=votre_mot_de_passe
```

4. **Créer la base de données MySQL :**
```sql
CREATE DATABASE sar_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```

5. **Exécuter les migrations :**
```bash
php artisan migrate
```

6. **Créer le lien symbolique pour le stockage :**
```bash
php artisan storage:link
```

7. **Démarrer le serveur de développement :**
```bash
php artisan serve
```

Le serveur sera accessible sur `http://localhost:8000`

## 📁 Structure du projet

```
backend/
├── app/
│   ├── Http/
│   │   └── Controllers/
│   │       └── Api/
│   │           └── ActualiteController.php
│   └── Models/
│       └── Actualite.php
├── config/
│   ├── database.php
│   ├── cors.php
│   └── filesystems.php
├── database/
│   └── migrations/
│       └── 2024_01_01_000000_create_actualites_table.php
├── routes/
│   └── api.php
└── public/
    └── media/  (pour les images)
```

## 🔌 API Endpoints

### Liste des actualités
```
GET /api/actualites
```

**Paramètres de requête :**
- `locale` (optionnel) : `fr` ou `en` (défaut: `fr`)
- `search` (optionnel) : Recherche par mot-clé
- `featured` (optionnel) : `true` pour le format liste (page d'accueil)

**Exemple :**
```
GET /api/actualites?locale=en&featured=true
```

### Détails d'une actualité
```
GET /api/actualites/{id}
```

**Paramètres de requête :**
- `locale` (optionnel) : `fr` ou `en` (défaut: `fr`)

**Exemple :**
```
GET /api/actualites/1?locale=en
```

### Jours sans accident (sécurité)
```
GET /api/safety/days-without-accident
```

Retourne le nombre de jours sans accident et la date de dernière incrémentation. Le compteur est incrémenté automatiquement chaque nuit à minuit (voir Planificateur ci-dessous).

**Exemple de réponse :**
```json
{ "days_without_accident": 3269, "last_incremented_at": "2025-02-05" }
```

**Admin :** Dans `/admin`, menu « Jours sans accident » pour saisir ou modifier le nombre manuellement (ex. après un accident, remettre à 0).

## ⏰ Planificateur (Jours sans accident)

Pour que le compteur s’incrémente chaque nuit à minuit, exécuter le planificateur Laravel chaque minute (cron) :

```bash
* * * * * cd /chemin/vers/portail-sar-backend && php artisan schedule:run >> /dev/null 2>&1
```

La commande `safety:increment-days` est programmée à 00:00 chaque jour.

## 🔧 Configuration CORS

Les origines autorisées sont configurées dans `config/cors.php` et peuvent être modifiées via la variable d'environnement `CORS_ALLOWED_ORIGINS` :

```env
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000
```

## 🚀 Déploiement

### Railway

Le fichier `nixpacks.toml` est configuré pour Railway. Assurez-vous de configurer les variables d'environnement :

```env
APP_KEY=base64:...
DB_CONNECTION=mysql
DB_HOST=...
DB_PORT=3306
DB_DATABASE=...
DB_USERNAME=...
DB_PASSWORD=...
CORS_ALLOWED_ORIGINS=https://votre-frontend.vercel.app
```

### Variables d'environnement requises

- `APP_KEY` : Clé de chiffrement Laravel (générée avec `php artisan key:generate`)
- `DB_*` : Configuration MySQL
- `CORS_ALLOWED_ORIGINS` : Origines autorisées pour CORS

## 🔍 Dépannage (audit backend / actualités)

### Erreur : `SQLSTATE[HY000] [2002] Aucune connexion n'a pu être établie...` (table `actualites`)

**Cause :** MySQL n’est pas joignable (service arrêté ou MySQL non démarré, mauvais host/port, ou base non créée).

**Diagnostic (pourquoi MySQL ne répond pas) :**  
Exécuter le script de diagnostic (écrit des logs détaillés dans `storage/logs/`) :
```bat
scripts\run-diagnose-mysql.bat
```
Ou depuis PowerShell à la racine du backend :
```powershell
.\scripts\diagnose-mysql.ps1
```
Le script vérifie : présence des binaires MySQL, port 3306 en écoute, processus mysqld, services Windows, test TCP 127.0.0.1:3306, test client `mysql`, test PDO avec les valeurs du `.env`. Les logs sont dans `storage/logs/mysql-diagnostic-*.log` et `mysql-connection-test-*.log`.

**Démarrer MySQL au démarrage de l’ordinateur (recommandé) :**  
Exécuter **en tant qu’administrateur** (clic droit → « Exécuter en tant qu’administrateur ») : `scripts\install-mysql-service.bat`. Le script enregistre MySQL comme service Windows (`MySQL80`), le configure en démarrage automatique et le démarre. Après redémarrage du PC, MySQL sera relancé automatiquement. Vérifier dans `services.msc` (chercher « MySQL80 »).

**Démarrer MySQL manuellement (Windows, sans service) :**
1. Double-cliquer sur `scripts/start-mysql.bat` (ou exécuter depuis le dossier backend). Une fenêtre « MySQL » s’ouvre et le serveur écoute sur `127.0.0.1:3306`. Ne pas fermer cette fenêtre tant que vous utilisez le backend.
2. Si MySQL est installé ailleurs, éditer `scripts/start-mysql.bat` et adapter `MYSQL_HOME` (ex. `C:\Program Files\MySQL\MySQL Server 8.0`).

**Ensuite :**
1. Créer la base et l’utilisateur si besoin : exécuter `database/create_mysql_database.sql` avec un compte ayant les droits CREATE DATABASE (ex. `mysql -u root -p < database/create_mysql_database.sql`).
2. Vérifier dans `.env` : `DB_HOST=127.0.0.1`, `DB_PORT=3306`, `DB_DATABASE=portail_sar`, `DB_USERNAME=portail_sar_user`, `DB_PASSWORD=root`.
3. Lancer les migrations : `php artisan migrate`.

### Erreur frontend : `localhost:8000/api/actualites/` → `ERR_CONNECTION_REFUSED`

**Cause :** Le frontend appelle `http://localhost:8000` alors que Laravel écoute sur `http://10.113.245.36:8000` (`php artisan serve --host=10.113.245.36` n’écoute pas sur 127.0.0.1).

**À faire (frontend) :** Créer ou modifier `portail-sar-frontend/.env.local` avec :
```env
NEXT_PUBLIC_API_URL=http://10.113.245.36:8000
```
Puis redémarrer le serveur Next.js.

**Backend :** Dans le `.env` du backend, ajouter l’origine CORS et l’URL de l’app :
```env
APP_URL=http://10.113.245.36:8000
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000,http://10.113.245.36:3000
```

## 📝 Notes

- Les images sont stockées dans `public/media/actualites/`
- La détection de la locale se fait via le paramètre `locale` ou le header `Accept-Language`
- Le format de date est localisé (français/anglais)
