Application web (PWA) pour gérer une cave à vin, y compris hors connexion.
- React 19.2.0 avec TypeScript
- Vite 7.2.4
- React Router
- PHP avec Slim Framework 4
- PHP-DI pour l'injection de dépendances
- Gestion des armoires à vin
- Enregistrement des bouteilles (dans une armoire)
- Enregistrement des cartons (hors armoire)
- Présentation des vins disponibles (stock total)
- Gestion du millésime :
- millésime explicite s'il est saisi
- sinon fallback automatique au mois/année d'enregistrement
- Persistance locale (localStorage) pour fonctionnement hors connexion
- Synchronisation automatique de la cave avec l'API quand la connexion est disponible (dont retour en ligne)
- Manifest + service worker pour usage PWA
- Node.js 20+ avec Corepack activé (
corepack enable) - PHP 8.1+ avec les extensions
pdo_sqlite,gdetsodium - Composer
Le gestionnaire de paquets est Yarn 4, épinglé par le champ packageManager
de package.json : Corepack installe la bonne version automatiquement.
-
Cloner le projet
-
Installer les dépendances Frontend
yarn install
-
Installer les dépendances Backend
composer install
yarn devAccès: http://localhost:5173
php -S localhost:8080 -t public public/router.phpAccès: http://localhost:8080/api
Le script
public/router.phpest optionnel :php -S localhost:8080 -t publicsuffit, le serveur intégré de PHP remontant le chemin jusqu'àpublic/api/index.php. Le passer rend simplement le routage explicite.
├── app/ # Code source React
│ ├── components/ # Composants réutilisables
│ ├── pages/ # Pages de l'application
│ ├── hooks/ # Hooks personnalisés
│ └── stores/ # Stores Zustand
├── api/ # Code source PHP
│ ├── bootstrap.php # Point d'entrée de l'API
│ ├── container.php # Configuration DI
│ ├── router.php # Définition des routes
│ └── Invintory/ # Code métier organisé par domaine
└── public/ # Fichiers publics
└── api/
└── index.php # Point d'entrée API
yarn dev- Serveur de développementyarn build- Build de productionyarn lint- Linting et formatage Biomeyarn preview- Prévisualiser le build
yarn api:check- Vérifie queopenapi.yamlcorrespond aux routes deapi/router.phpyarn api:lint- Valide la spécificationyarn api:docs- Régénèrepublic/openapi.html(non versionné)
Un docker compose up régénère la documentation au démarrage et la sert sur
http://localhost:5173/openapi.html.
composer dump-autoload- Régénérer l'autoloader
- Les endpoints
POST /api/auth/registeretPOST /api/auth/loginrenvoient un JWT signé. - Durée de vie du JWT : 1 heure (
exp), sans refresh token. - Endpoint sécurisé :
GET /api/auth/me(header Authorization avec un bearer JWT). - Endpoints sécurisés de cave :
GET /api/cellaretPUT /api/cellar(JWT requis). - Secret de signature configurable via la variable d'environnement
JWT_SECRET(valeur de développement par défaut si absente). - La génération/validation JWT backend s'appuie sur la librairie externe
lcobucci/jwt.
- Upload temporaire sécurisé :
POST /api/images/temp(multipart, champimage, JWT requis). - Les images de bouteilles sont standardisées côté backend via GD2 en
512x1024, exportées enJPEGqualité85, avec bandes noires latérales si nécessaire ou recadrage centré horizontalement. - Lecture d'une image via route sécurisée passe-plat :
GET /api/images/{imageId}(JWT requis). - La bascule temporaire → finale est gérée en interne par le backend lors de l'accès sécurisé à l'image, avec nettoyage des autres images temporaires utilisateur.
- Les fichiers image sont stockés côté serveur dans
data/images/(à la racine du dépôt, répertoire ignoré par git) et ne sont pas exposés en accès statique public. - Dans le front, les champs illustration utilisent
accept="image/*"etcapture="environment"pour faciliter l'usage de la caméra.
MIT