From 1244e7f8c3a2ea0a86de1c263f1a9ff63bc55a5b Mon Sep 17 00:00:00 2001 From: Imugiii Date: Mon, 15 Jun 2026 13:34:41 +0000 Subject: [PATCH] feat(db): wire make migrate/seed to db runners; add seed runner; commit docs-render target --- Makefile | 23 ++++++++++++++---- db/seed.sh | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 4 deletions(-) create mode 100755 db/seed.sh diff --git a/Makefile b/Makefile index 1c1ee94..d7734cb 100644 --- a/Makefile +++ b/Makefile @@ -156,12 +156,12 @@ wait-db: ## Attend que la base de donnees accepte les connexions (timeout 60s) @echo "[wait-db] OK" .PHONY: migrate -migrate: ## Applique les migrations SQL en attente [a venir] - @echo "[migrate] Pas encore implemente. Les migrations seront dans db/migrations/." +migrate: ## Applique les migrations SQL en attente (db/migrations/) + @bash db/migrate.sh .PHONY: seed -seed: ## Charge les donnees de demo [a venir] - @echo "[seed] Pas encore implemente. Les seeds seront dans db/seeds/." +seed: ## Charge les donnees de demo (db/seeds/) + @bash db/seed.sh .PHONY: backup backup: ## Declenche un dump SQL horodate immediat (via le container cron) @@ -211,6 +211,21 @@ clean: ## Stop + suppression containers + volumes (DESTRUCTIF, demande confirmat clean-force: ## Version non interactive de clean (pour CI uniquement) @$(COMPOSE) down -v +# === Documentation === + +.PHONY: docs-render +docs-render: ## Regenere les diagrammes Mermaid (docs/**/_diagrams/*.mmd -> *.svg) + @echo "[docs-render] Recherche des sources Mermaid sous docs/..." + @count=0; \ + for src in $$(find docs -name '*.mmd' -path '*/_diagrams/*'); do \ + out="$${src%.mmd}.svg"; \ + echo " $$src -> $$out"; \ + npx -y -p @mermaid-js/mermaid-cli mmdc -i "$$src" -o "$$out" >/dev/null 2>&1 \ + || { echo "[docs-render] ECHEC sur $$src"; exit 1; }; \ + count=$$((count + 1)); \ + done; \ + echo "[docs-render] $$count diagramme(s) genere(s)." + # === Hooks Git === .PHONY: install-hooks diff --git a/db/seed.sh b/db/seed.sh new file mode 100755 index 0000000..9b0f398 --- /dev/null +++ b/db/seed.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# +# Wakdo - seed runner. +# +# Applique les fichiers db/seeds/*.sql dans l'ordre lexicographique, de maniere +# idempotente : une table seed_history enregistre les fichiers deja charges. +# Les seeds doivent etre joues APRES les migrations (les tables doivent exister). +# +# Cible : le service docker-compose `wakdo-db`. Identifiants lus dans .env. +# +# Usage : +# bash db/seed.sh # charge les seeds en attente +# bash db/seed.sh --status # liste l'etat sans rien charger +# +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +ENV_FILE="$ROOT/.env" +CONTAINER="${WAKDO_DB_CONTAINER:-wakdo-db}" +SEEDS_DIR="$ROOT/db/seeds" + +[ -f "$ENV_FILE" ] || { echo "ERREUR : .env introuvable ($ENV_FILE)" >&2; exit 1; } +DB_NAME="$(grep -E '^DB_NAME=' "$ENV_FILE" | cut -d= -f2- | tr -d '[:space:]')" +DB_ROOT_PASSWORD="$(grep -E '^DB_ROOT_PASSWORD=' "$ENV_FILE" | cut -d= -f2-)" +: "${DB_NAME:?DB_NAME absent de .env}" +: "${DB_ROOT_PASSWORD:?DB_ROOT_PASSWORD absent de .env}" + +db() { docker exec -i "$CONTAINER" mariadb -uroot -p"$DB_ROOT_PASSWORD" "$@"; } + +docker exec "$CONTAINER" true 2>/dev/null || { echo "ERREUR : conteneur $CONTAINER non demarre (make up)" >&2; exit 1; } + +if [ ! -d "$SEEDS_DIR" ]; then + echo "[seed] aucun repertoire db/seeds/ - rien a charger" + exit 0 +fi + +db "$DB_NAME" -e "CREATE TABLE IF NOT EXISTS seed_history ( + filename VARCHAR(255) NOT NULL PRIMARY KEY, + applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;" + +shopt -s nullglob +files=("$SEEDS_DIR"/*.sql) +[ ${#files[@]} -gt 0 ] || { echo "[seed] aucun fichier seed dans $SEEDS_DIR"; exit 0; } + +if [ "${1:-}" = "--status" ]; then + echo "[seed] etat des seeds (base $DB_NAME) :" + for f in "${files[@]}"; do + base="$(basename "$f")" + n="$(db "$DB_NAME" -N -s -e "SELECT COUNT(*) FROM seed_history WHERE filename='$base';")" + [ "$n" = "0" ] && echo " PENDING $base" || echo " loaded $base" + done + exit 0 +fi + +loaded=0 +for f in "${files[@]}"; do + base="$(basename "$f")" + n="$(db "$DB_NAME" -N -s -e "SELECT COUNT(*) FROM seed_history WHERE filename='$base';")" + if [ "$n" = "0" ]; then + echo "[seed] chargement de $base ..." + db "$DB_NAME" < "$f" + db "$DB_NAME" -e "INSERT INTO seed_history (filename) VALUES ('$base');" + loaded=$((loaded + 1)) + else + echo "[seed] $base deja charge, ignore" + fi +done +echo "[seed] termine ($loaded nouveau(x) seed(s) charge(s))."