# Coaster World v1.73.2 — Live résilient / héritage ancien site

## Objectif

Reprendre le mécanisme de mise à jour Live qui rendait l’ancien Coaster World fiable, tout en conservant les garde-fous modernes de la v1.73.x et la cadence recommandée par ThemeParks.wiki.

## Ce qui est repris de l’ancien site

L’ancien site utilisait deux niveaux complémentaires :

- la fiche parc relisait régulièrement une API Coaster World ;
- cette API pouvait elle-même synchroniser le parc consulté si ses données étaient trop anciennes ;
- un verrou MySQL `GET_LOCK()` par parc empêchait plusieurs visiteurs ou tâches de synchroniser le même parc en parallèle ;
- un traitement planifié global complétait le système, sans être indispensable aux parcs réellement consultés.

La v1.73.2 reprend cette architecture dans Laravel.

## Live par parc

- `/api/v1/parks/{park}/live` reste relu toutes les 30 secondes dans le navigateur.
- La page peut déclencher elle-même la vraie synchronisation ThemeParks.wiki dès que la fenêtre upstream de 5 minutes est arrivée à échéance.
- Le verrou par parc utilise maintenant en priorité **MySQL `GET_LOCK()` / `RELEASE_LOCK()`**.
- Le verrou est donc commun à Apache/PHP, Artisan, au compte Windows SYSTEM et à tous les visiteurs utilisant la même base.
- Un verrou Laravel fichier reste disponible comme fallback pour un environnement non-MySQL.
- Après une synchronisation ou lorsqu’un autre processus détient le verrou, la page effectue jusqu’à deux relectures locales rapides (2,5 s puis 6 s) si aucune donnée fraîche n’est encore affichable. Ces relectures ne forcent pas un nouvel appel ThemeParks.wiki.

## Scheduler

- `cw:live:sync` passe lui aussi par `ParkLiveRefreshService` : scheduler et visiteurs partagent donc exactement le même verrou.
- Le scheduler ne duplique plus une synchronisation qu’un visiteur vient de lancer.
- Nouveau `--force` pour provoquer volontairement un appel upstream manuel :

```bat
php artisan cw:live:sync --all --force
```

- La tâche automatique reste :

```text
cw:live:sync --all --active
```

et respecte la fenêtre de fraîcheur.

## Windows / Laragon

Correction importante de `tools/run_scheduler_windows.bat` :

- la v1.73.1 prenait le premier dossier PHP Laragon trouvé ;
- cela pouvait sélectionner une installation sans `pdo_mysql` et produire `PDOException: could not find driver` ;
- la v1.73.2 scanne les PHP Laragon et ne retient qu’un **PHP >= 8.3 avec `pdo_mysql` chargé** ;
- si aucun PHP compatible n’existe, la tâche renvoie une vraie erreur au lieu de prétendre avoir réussi ;
- mode diagnostic ajouté :

```bat
tools\run_scheduler_windows.bat --check
```

- `install_scheduler_windows.bat` exécute ce diagnostic avant de créer/remplacer la tâche Windows.

## Ouverture / fermeture des parcs

Le fonctionnement v1.73.1 est conservé :

- les horaires ThemeParks.wiki sont stockés et périodiquement revérifiés ;
- l’état **Ouvert / Ouverture prévue / Fermé** est recalculé localement à chaque réponse Live avec le fuseau du parc ;
- le changement d’état peut donc apparaître dans les ~30 secondes, sans attendre une nouvelle synchronisation des horaires ;
- une attraction Live fraîche et ouverte peut confirmer une prolongation d’ouverture.

## Base de données

Aucune migration SQL.
