# Projet Ferme t ## Installation du projet ### Windows Pour windows, il faut installer le WSL2, Ubuntu, docker et nvm. Il suffit de suivre cette [doc](https://wiki.malio.fr/bookstack/books/environnement-de-dev/chapter/windows) ### Linux Pour linux, il faut installer docker et nvm. Il suffit de suivre cette [doc](https://wiki.malio.fr/bookstack/books/environnement-de-dev/chapter/linux) ### Installation du projet Une fois les prérequis installés, il suffit de cloner le projet et de lancer les commandes suivantes ```bash make start make install ``` Dans le cas ou le `make start` plante à cause du port de la bdd, il faut modifier **POSTGRES_PORT** dans le fichier .env.docker.local, remplacer le par un port disponible. ### Configuration global Pour les variables d'environnement, il faut demander un .env.local pour le backend et un .env pour le frontend à votre collègue. Vérifier que dans le .env.local, vous avez : - APP_SECRET (à généré dans le conteneur avec la commande php -r "echo bin2hex(random_bytes(32));" et doit être différent de celui de votre collègue, puisque utilisé pour signer des tokens) - DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:${POSTGRES_PORT}/${POSTGRES_DB}?serverVersion=16&charset=utf8" - PONT_BASCULE_BYPASS (doit être à true en dev) - PONT_BASCULE_URL - JWT_SECRET_KEY (à générer avec la commande php bin/console lexik:jwt:generate-keypair) - JWT_PUBLIC_KEY - JWT_PASSPHRASE (à généré dans le conteneur avec la commande php -r "echo bin2hex(random_bytes(32));") - COOKIE_SECURE=0 (en dev 0 et en prod 1. Si c'est du http, laisser en 0) Vérifier que dans le .env du dossier frontend, vous avez : - NUXT_PUBLIC_API_BASE="http://localhost:8080/api" ### Configuration xdebug Pour configurer xdebug, il faut ajouter un serveur sur phpstorm.
Pour cela, il faut aller dans **Settings > PHP > Servers**
- Name : ferme-docker - Host : localhost - Port : 8080 - Path : File/Directory -> l'endroit où est stocké votre projet et le path -> /var/www/html Pour que xdebug fonctionne sur windows, il faut modifier la variable **XDEBUG_CLIENT_HOST** par votre ip local ## Utilisation du projet ### Backend L'api est disponible sur http://localhost:8080/api Pour la bdd toutes les infos sont dans le fichier **docker/.env.docker.local** Vous pouvez modifier le port si nécessaire. La bdd est déja pré-configuré dans PhpStorm, il suffit de rentrer les infos du .env.docker.local pour se connecter. C'est un bdd local dans le docker. ### Frontend Pour le frontend, il suffit de taper la commande suivante qui va lancer le serveur de dev ```bash make dev-nuxt ``` Le front sera accessible sur http://localhost:3000 ### Authentification Ce projet utilise l'authentification JWT avec un cookie httpOnly (LexikJWTAuthenticationBundle). Le frontend ne lit jamais directement le token, le navigateur envoie automatiquement le cookie. ### Login flow - Frontend envoie les identifiants à: - `POST /api/login_check` - Backend returns: - `204 No Content` (normal) - `Set-Cookie: BEARER=...; HttpOnly` - Le cookie est automatiquement envoyé pour les futures requêtes. - La déconnexion utilise `POST /api/logout` et redirige vers `/login`. ### Fixtures Pour lancer les fixtures (Attention sa purge la bdd complètement) ```bash php bin/console doctrine:fixtures:load ``` Attention cette commande est dangereuse, à utiliser que pour les débuts de la prod ou en recette. Dans un premier temps pour remplir les listes, vous pouvez lancer la commande symfony ```bash php bin/console app:seed ``` La commande va faire une update ou une création en fonction des data existante. ## Livraison en recette ### Préparatifs Avant de déployer, il faut penser à ajouter les variables d'env s'il y a des changements/modifications. Le .env se trouve /var/www/ferme/.env Le script de livraison est version dans le repo dans script/deploy-release.sh
Sur la machine, il est disponible dans /usr/local/bin/deploy-ferme
Pour le modifier, il faut copier le contenu du deploy-release.sh dans le deploy-ferme ### Livraison Sur le serveur de recette, il suffit d'utiliser cette commande pour livrer ```bash /usr/local/bin/deploy-ferme vX.Y.Z ``` ## Commandes utiles Pour restart le container ```bash make restart ``` Pour lancer les TU ```bash make test ``` Pour accéder au container et lance des commandes ```bash make shell ``` Pour clear le cache Symfony ```bash make cache-clear ``` Faire une migration ```bash make migration-migrate ``` Pour générer un password pour un user ```bash make shell php bin/console security:hash-password ``` Sélectionner entity User, taper sont mdp, le copier et l'ajouter dans l'insert de bdd suivant : ```sql INSERT INTO "user" (username, roles, password) VALUES ('Mon user', '["ROLE_USER"]', 'Mon mdp hashé'); ``` ## Gestion des logs Pour suivre les logs en temps réel : - tail -f var/log/dev.log - tail -f var/log/prod.log ## Feed des prix bovins Une commande Symfony permet de mettre à jour le **poids à l'arrivée**, le **prix au kilo** et le **fournisseur** des bovins existants à partir d'un fichier XLSX. La commande **ne crée jamais de nouveau bovin** : elle complète seulement ceux déjà présents en BDD. ### Format du fichier XLSX attendu Pas de ligne d'en-tête, 4 colonnes dans cet ordre : | Colonne | Champ | Format | Exemple | |---------|-------|--------|---------| | A | Numéro national | Avec ou sans préfixe `FR ` (insensible casse) | `FR 7979580026` ou `7979580026` | | B | Fournisseur | Texte libre, casse ignorée | `TERRENA` | | C | Poids à l'arrivée (kg) | Entier | `368` | | D | Prix au kilo | Décimal | `5.7` | | E | Code bâtiment (optionnel) | `B1`, `B2`, `B3`, `ZT` (casse ignorée) | `B2` | ### Comportement - **Numéro national** : le préfixe `FR` (avec ou sans espace) est retiré s'il est présent. Sinon la valeur est utilisée telle quelle. - **Bovin introuvable** en BDD → ligne ignorée, log warning à la fin avec aperçu. - **Fournisseur introuvable** en BDD → le bovin est mis à jour quand même avec `supplier = null`, log warning. - **Bâtiment** (colonne E) : recherché par `code` (insensible casse). Set uniquement si le bovin n'a pas déjà une `buildingCase` assignée (la case prime sur le bâtiment direct côté affichage). Si code introuvable → log warning, champ non set. - **Cellules `weight` / `price` vides ou non numériques** → champ non modifié. - La commande est **idempotente** : peut être relancée sans effet de bord. ### Lancement en dev Copie le fichier dans la racine du projet (mappée dans le container sous `/var/www/html`), puis : ```bash # Simulation sans écriture en BDD docker compose exec php bin/console app:feed-bovine-prices /var/www/html/feed_bovin.xlsx --dry-run # Persistance effective docker compose exec php bin/console app:feed-bovine-prices /var/www/html/feed_bovin.xlsx ``` ### Lancement en prod Le user SSH n'a généralement pas les droits d'écriture sur `/var/www/ferme/` ; on passe donc le fichier par `/tmp` et on pointe la commande dessus (le chemin du XLSX est juste un argument). ```bash # 1. Copier le fichier sur le serveur dans /tmp (accessible en écriture) scp feed_bovin.xlsx @:/tmp/ # 2. SSH sur le serveur ssh @ # 3. Se placer dans le dossier de l'app (pour bin/console) cd /var/www/ferme # 4. Dry-run pour vérifier sans rien écrire php bin/console app:feed-bovine-prices /tmp/feed_bovin.xlsx --dry-run # 5. Persistance effective php bin/console app:feed-bovine-prices /tmp/feed_bovin.xlsx # 6. Cleanup rm /tmp/feed_bovin.xlsx ``` > Si à l'étape 4 le user PHP (souvent `www-data`) n'arrive pas à lire le fichier (`Permission denied`), donne-lui les droits de lecture avant : `chmod 644 /tmp/feed_bovin.xlsx`. ### Sortie attendue À la fin, un tableau récapitule : - Lignes totales lues - Bovins mis à jour - Bovins introuvables (avec aperçu des 10 premiers numéros) - Lignes invalides (numéro national vide) - Fournisseurs introuvables (avec liste et compte par nom) - Bâtiments introuvables (avec liste des codes inconnus)