Les établissements ont besoin de protéger les élèves et familles des devoirs de dernière minute. Cette configuration au niveau tenant permet de définir des règles de timing (délai minimum, pas de devoir pour lundi après une heure limite) et un mode d'application (avertissement, blocage ou désactivé). Le service de validation est prêt pour être branché dans le flux de création de devoirs (Stories 5.4/5.5). L'historique des changements assure la traçabilité des modifications de configuration.
300 lines
13 KiB
Makefile
300 lines
13 KiB
Makefile
.DEFAULT_GOAL := help
|
|
|
|
# =============================================================================
|
|
# Docker
|
|
# =============================================================================
|
|
|
|
# Fichiers compose - ajouter monitoring si MONITORING=1
|
|
COMPOSE_FILES := -f compose.yaml
|
|
ifdef MONITORING
|
|
COMPOSE_FILES += -f compose.monitoring.yaml
|
|
endif
|
|
|
|
.PHONY: up
|
|
up: ## Lancer les services (ajouter MONITORING=1 pour inclure observabilité)
|
|
docker compose $(COMPOSE_FILES) up -d
|
|
|
|
.PHONY: up-full
|
|
up-full: ## Lancer TOUS les services (app + monitoring)
|
|
docker compose -f compose.yaml -f compose.monitoring.yaml up -d
|
|
|
|
.PHONY: down
|
|
down: ## Arrêter tous les services (app + monitoring)
|
|
docker compose -f compose.yaml -f compose.monitoring.yaml down --remove-orphans
|
|
|
|
.PHONY: restart
|
|
restart: ## Redémarrer les services
|
|
docker compose $(COMPOSE_FILES) down
|
|
docker compose $(COMPOSE_FILES) up -d
|
|
|
|
.PHONY: rebuild
|
|
rebuild: ## Reconstruire et relancer les services (sans cache)
|
|
docker compose $(COMPOSE_FILES) down
|
|
docker compose $(COMPOSE_FILES) build --no-cache
|
|
docker compose $(COMPOSE_FILES) up -d
|
|
|
|
.PHONY: build
|
|
build: ## Reconstruire les images Docker (sans cache)
|
|
docker compose $(COMPOSE_FILES) build --no-cache
|
|
|
|
.PHONY: logs
|
|
logs: ## Voir les logs de tous les services (Ctrl+C pour quitter)
|
|
docker compose $(COMPOSE_FILES) logs -f
|
|
|
|
.PHONY: ps
|
|
ps: ## Afficher le statut des services
|
|
docker compose $(COMPOSE_FILES) ps
|
|
|
|
.PHONY: clean
|
|
clean: ## Supprimer volumes et images locales
|
|
docker compose -f compose.yaml -f compose.monitoring.yaml down -v --rmi local
|
|
|
|
# =============================================================================
|
|
# Monitoring
|
|
# =============================================================================
|
|
|
|
.PHONY: monitoring-up
|
|
monitoring-up: ## Lancer uniquement les services de monitoring
|
|
docker compose -f compose.monitoring.yaml up -d
|
|
|
|
.PHONY: monitoring-down
|
|
monitoring-down: ## Arrêter les services de monitoring
|
|
docker compose -f compose.monitoring.yaml down
|
|
|
|
.PHONY: monitoring-logs
|
|
monitoring-logs: ## Voir les logs du monitoring
|
|
docker compose -f compose.monitoring.yaml logs -f
|
|
|
|
.PHONY: grafana
|
|
grafana: ## Ouvrir Grafana dans le navigateur (http://localhost:3001)
|
|
@echo "Grafana: http://localhost:3001 (admin/admin)"
|
|
@command -v xdg-open >/dev/null && xdg-open http://localhost:3001 || echo "Ouvrir manuellement: http://localhost:3001"
|
|
|
|
.PHONY: prometheus
|
|
prometheus: ## Ouvrir Prometheus dans le navigateur (http://localhost:9090)
|
|
@echo "Prometheus: http://localhost:9090"
|
|
@command -v xdg-open >/dev/null && xdg-open http://localhost:9090 || echo "Ouvrir manuellement: http://localhost:9090"
|
|
|
|
.PHONY: glitchtip
|
|
glitchtip: ## Ouvrir GlitchTip dans le navigateur (http://localhost:8081)
|
|
@echo "GlitchTip: http://localhost:8081"
|
|
@command -v xdg-open >/dev/null && xdg-open http://localhost:8081 || echo "Ouvrir manuellement: http://localhost:8081"
|
|
|
|
# =============================================================================
|
|
# 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: setup-test-db
|
|
setup-test-db: ## Créer et migrer la base de test PostgreSQL
|
|
docker compose exec php php bin/console doctrine:database:create --if-not-exists --env=test -q
|
|
docker compose exec php php bin/console doctrine:migrations:migrate --no-interaction --env=test -q
|
|
|
|
.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: e2e-ci e2e-ratelimit ## Lancer tous les tests E2E (CI + rate limiting)
|
|
|
|
.PHONY: e2e-ci
|
|
e2e-ci: ## Lancer les tests E2E sans rate limiting (rapide, parallèle)
|
|
docker compose exec php php bin/console cache:pool:clear cache.rate_limiter --env=dev
|
|
cd frontend && CI=true PLAYWRIGHT_BASE_URL=http://ecole-alpha.classeo.local:5174 npx playwright test
|
|
|
|
.PHONY: e2e-ratelimit
|
|
e2e-ratelimit: ## Lancer les tests de rate limiting (lent, séquentiel)
|
|
docker compose exec php php bin/console cache:pool:clear cache.rate_limiter --env=dev
|
|
cd frontend && PLAYWRIGHT_BASE_URL=http://ecole-alpha.classeo.local:5174 npx playwright test --workers=1 --grep="Rate Limiting|CAPTCHA"
|
|
|
|
# =============================================================================
|
|
# 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 "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
@echo ""
|
|
@echo " Note: Tests E2E (make e2e) à lancer séparément depuis l'hôte"
|
|
|
|
# =============================================================================
|
|
# Scripts
|
|
# =============================================================================
|
|
|
|
.PHONY: setup-hooks
|
|
setup-hooks: ## Installer les git hooks (pre-push: make ci)
|
|
@echo "Installation des git hooks..."
|
|
@cp scripts/hooks/pre-push .git/hooks/pre-push
|
|
@chmod +x .git/hooks/pre-push
|
|
@echo "✅ Git hooks installés (pre-push)"
|
|
|
|
.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 setup-hooks migrate warmup ## Installation complète après clone
|
|
|
|
.PHONY: migrate
|
|
migrate: ## Exécuter les migrations Doctrine
|
|
docker compose exec php php bin/console doctrine:database:create --if-not-exists
|
|
docker compose exec php php bin/console doctrine:migrations:migrate --no-interaction
|
|
|
|
.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 ""
|