.DEFAULT_GOAL := help # ============================================================================= # Docker # ============================================================================= .PHONY: up up: ## Lancer tous les services docker compose up -d .PHONY: down down: ## Arrêter tous les services docker compose down .PHONY: restart restart: ## Redémarrer tous les services docker compose down docker compose up -d .PHONY: rebuild rebuild: ## Reconstruire et relancer les services (sans cache) docker compose down docker compose build --no-cache docker compose up -d .PHONY: build build: ## Reconstruire les images Docker (sans cache) docker compose build --no-cache .PHONY: logs logs: ## Voir les logs de tous les services (Ctrl+C pour quitter) docker compose logs -f .PHONY: ps ps: ## Afficher le statut des services docker compose ps .PHONY: clean clean: ## Supprimer volumes et images locales docker compose down -v --rmi local # ============================================================================= # Shell # ============================================================================= .PHONY: shell shell: ## Ouvrir un shell dans le container PHP docker compose exec php sh .PHONY: bash bash: shell ## Alias pour 'make shell' .PHONY: console console: ## Exécuter une commande Symfony (ex: make console c='debug:router') docker compose exec php php bin/console $(c) .PHONY: shell-frontend shell-frontend: ## Ouvrir un shell dans le container frontend docker compose exec frontend sh # ============================================================================= # Backend - Qualité # ============================================================================= .PHONY: phpstan phpstan: ## Analyse statique PHPStan (level 9) docker compose exec php composer phpstan .PHONY: arch arch: ## Tests d'architecture PHPat docker compose exec php composer arch .PHONY: cs-fix cs-fix: ## Corriger le code style PHP (PHP-CS-Fixer) docker compose exec php composer cs-fix .PHONY: cs-check cs-check: ## Vérifier le code style PHP sans corriger docker compose exec php composer cs-check .PHONY: test-php test-php: ## Lancer les tests PHPUnit docker compose exec -e APP_ENV=test php composer test .PHONY: warmup warmup: ## Préchauffer le cache Symfony docker compose exec php php bin/console cache:warmup # ============================================================================= # Frontend - Qualité # ============================================================================= .PHONY: lint lint: ## Lancer ESLint sur le frontend docker compose exec frontend pnpm run lint .PHONY: check-types check-types: ## Vérifier les types TypeScript (svelte-check) docker compose exec frontend pnpm run check .PHONY: test-js test-js: ## Lancer les tests Vitest docker compose exec frontend pnpm run test .PHONY: e2e e2e: ## Lancer les tests E2E Playwright docker compose exec frontend pnpm run test:e2e # ============================================================================= # Tout-en-un # ============================================================================= .PHONY: test test: test-php test-js ## Lancer tous les tests (PHPUnit + Vitest) .PHONY: check check: phpstan cs-check lint check-types ## Lancer tous les linters et checks .PHONY: ci ci: ## Lancer TOUS les tests et checks (comme en CI) @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @echo " Code Style PHP (PHP-CS-Fixer)" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @$(MAKE) cs-check @echo "" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @echo " Analyse statique PHP (PHPStan level 9)" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @$(MAKE) phpstan @echo "" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @echo " Tests d'architecture (PHPat)" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @$(MAKE) arch @echo "" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @echo " Tests PHP (PHPUnit)" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @$(MAKE) test-php @echo "" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @echo " Lint Frontend (ESLint)" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @$(MAKE) lint @echo "" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @echo " Types Frontend (svelte-check)" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @$(MAKE) check-types @echo "" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @echo " Tests Frontend (Vitest)" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @$(MAKE) test-js @echo "" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @echo " ✅ Tous les checks sont passés !" @echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" # ============================================================================= # Scripts # ============================================================================= .PHONY: check-bc check-bc: ## Vérifier l'isolation des Bounded Contexts ./scripts/check-bc-isolation.sh .PHONY: check-naming check-naming: ## Vérifier les conventions de nommage ./scripts/check-naming.sh .PHONY: check-tenants check-tenants: ## Vérifier que les tenants répondent ./scripts/check-tenants.sh # ============================================================================= # Setup initial # ============================================================================= .PHONY: install install: up jwt-keys warmup ## Installation complète après clone .PHONY: jwt-keys jwt-keys: ## Générer les clés JWT (requis après clone) @echo "Génération des clés JWT..." @docker compose exec php mkdir -p config/jwt @docker compose exec php openssl genpkey -out config/jwt/private.pem -aes256 -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -pass pass:$${JWT_PASSPHRASE:-classeo_jwt_passphrase_change_me} @docker compose exec php openssl pkey -in config/jwt/private.pem -out config/jwt/public.pem -pubout -passin pass:$${JWT_PASSPHRASE:-classeo_jwt_passphrase_change_me} @echo "Clés JWT générées dans backend/config/jwt/" # ============================================================================= # Dev helpers # ============================================================================= .PHONY: token token: ## Créer un token d'activation (interactif). Options: email=, role=, tenant=, minor=1 docker compose exec php php bin/console app:dev:create-test-activation-token \ $(if $(email),--email=$(email),) \ $(if $(role),--role=$(role),) \ $(if $(tenant),--tenant=$(tenant),) \ $(if $(minor),--minor,) \ --base-url=http://localhost:5174 .PHONY: token-alpha token-alpha: ## Créer un token sur ecole-alpha. Options: email=, role=, minor=1 docker compose exec -T php php bin/console app:dev:create-test-activation-token -n \ --tenant=ecole-alpha --base-url=http://ecole-alpha.classeo.local:5174 \ $(if $(email),--email=$(email),--email=alpha@test.com) \ $(if $(role),--role=$(role),) \ $(if $(minor),--minor,) .PHONY: token-beta token-beta: ## Créer un token sur ecole-beta. Options: email=, role=, minor=1 docker compose exec -T php php bin/console app:dev:create-test-activation-token -n \ --tenant=ecole-beta --base-url=http://ecole-beta.classeo.local:5174 \ $(if $(email),--email=$(email),--email=beta@test.com) \ $(if $(role),--role=$(role),) \ $(if $(minor),--minor,) # ============================================================================= # Help # ============================================================================= .PHONY: help help: ## Afficher cette aide @echo "" @echo " Classeo - Commandes disponibles" @echo "" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}' @echo ""