# Installation — Coaster World v1.104.0

## Objectif

Après cette version, il ne doit rester qu'un seul emplacement physique pour les images Coaster World :

`storage/app/public/media/`

`public/storage` n'est plus utilisé comme stockage ou comme lien obligatoire.

## Avant la mise à jour

Faire une sauvegarde de la base et, par sécurité, une copie des dossiers suivants s'ils existent :

- `public/storage/`
- `storage/app/public/media/`
- `storage/app/public/coaster-cards/`
- `storage/app/private/coaster-cards/`

## Installation recommandée sous Laragon / Windows

1. Remplacer les fichiers du projet par la v1.104.0.
2. Ouvrir un terminal dans `C:\laragon\www\coaster-world`.
3. Vérifier le support WebP de PHP :

```bat
php -r "echo extension_loaded('gd') && function_exists('imagewebp') ? 'WEBP OK' : 'WEBP MANQUANT';"
```

Si `WEBP MANQUANT` s'affiche, activer l'extension PHP `gd` dans Laragon puis redémarrer Apache/PHP.

4. Lancer la consolidation. Le script nettoie d’abord les caches Laravel pour charger la nouvelle configuration de stockage :

```bat
tools\consolidate_media_storage_windows.bat
```

ou directement :

```bat
php artisan optimize:clear
php artisan cw:media:consolidate
php artisan optimize:clear
```

## Ce que fait la consolidation

- copie les fichiers d'un éventuel vrai dossier `public/storage` vers le stockage canonique ;
- déplace les cartes depuis les anciens `coaster-cards` vers `media/coaster-cards` ;
- migre les médias image qui seraient encore sur un autre disque Laravel vers le disque média canonique ;
- met à jour `media_assets`, `media_variants`, `coaster_cards.front_image_path` et `coaster_card_backs.image_path` quand nécessaire ;
- conserve les fichiers en conflit dans `storage/app/public/media/legacy-conflicts/` ;
- supprime les anciens dossiers de cartes après vérification ;
- supprime le lien/jonction `public/storage` lorsqu'il peut l'identifier sans risque.

La commande est réexécutable : une seconde exécution ne doit pas dupliquer les fichiers déjà consolidés. En cas de conflit entre deux fichiers différents portant le même chemin, elle s'arrête sans supprimer la source et signale le conflit.

## Résultat attendu

Après une consolidation réussie :

- stockage unique : `storage/app/public/media/` ;
- plus de `storage/app/public/coaster-cards/` ;
- plus de `storage/app/private/coaster-cards/` ;
- `public/storage/` absent ;
- les images publiques continuent à utiliser des URL `/storage/media/...` ;
- les cartes restent accessibles via les URLs signées du classeur ;
- toute nouvelle image uploadée est enregistrée en `.webp`.
- toute nouvelle image reçoit également un nom normalisé et unique ; le nom original du fichier n’est conservé qu’en métadonnée quand le module média en a besoin ;
- les images déjà présentes sont déplacées sans recompression ni renommage forcé, afin d’éviter toute perte de qualité ou rupture de référence.

## Important

Ne plus exécuter `php artisan storage:link` pour les médias Coaster World à partir de cette version.

Aucune migration SQL de schéma n'est nécessaire pour v1.104.0. La mise à jour des chemins existants est effectuée par `cw:media:consolidate` car elle doit être synchronisée avec le déplacement réel des fichiers.
