#!/usr/bin/env bash # Factory-Defaults-Import – pflegt eine ZIP in eine OpenCRM-Instanz ein. # Idempotent (upserts pro Kategorie, nichts wird gelöscht). # # Aufruf: # ./factory-import.sh # jüngste ZIP aus factory-exports/ # ./factory-import.sh ./factory-exports/foo.zip # explizite ZIP # ./factory-import.sh --save-as-builtin # nach Import auch ins # ./factory-import.sh --save-as-builtin ./foo.zip # backend/factory-defaults/ # # entpacken → nächster # # Image-Build hat sie # # als Werkseinstellung # # ENV (wie factory-export.sh): # OPENCRM_URL (default http://localhost:3010) # OPENCRM_EMAIL (default admin@admin.com) # OPENCRM_PASSWORD (sonst interaktiv) set -euo pipefail URL="${OPENCRM_URL:-http://localhost:3010}" EMAIL="${OPENCRM_EMAIL:-admin@admin.com}" PASSWORD="${OPENCRM_PASSWORD:-}" REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" EXPORT_DIR="$REPO_ROOT/factory-exports" BUILTIN_DIR="$REPO_ROOT/backend/factory-defaults" # Argumente parsen: erlaubt sind --save-as-builtin und 0/1 ZIP-Pfade in # beliebiger Reihenfolge. SAVE_AS_BUILTIN=false ZIP_PATH="" for arg in "$@"; do case "$arg" in --save-as-builtin) SAVE_AS_BUILTIN=true ;; -h|--help) sed -n '2,16p' "$0" | sed 's/^# \?//' exit 0 ;; --*) echo "✗ Unbekanntes Flag: $arg"; exit 2 ;; *) if [ -n "$ZIP_PATH" ]; then echo "✗ Mehrere ZIP-Pfade angegeben (nur einer erlaubt)"; exit 2 fi ZIP_PATH="$arg" ;; esac done if [ -z "$ZIP_PATH" ]; then # Jüngste ZIP automatisch wählen ZIP_PATH="$(ls -1t "$EXPORT_DIR"/*.zip 2>/dev/null | head -1 || true)" if [ -z "$ZIP_PATH" ]; then echo "✗ Keine ZIP angegeben und keine in $EXPORT_DIR/ gefunden." echo " Aufruf: ./factory-import.sh " exit 1 fi echo "→ Keine ZIP angegeben – nehme jüngste aus $EXPORT_DIR/:" echo " $(basename "$ZIP_PATH")" fi if [ ! -f "$ZIP_PATH" ]; then echo "✗ Datei nicht gefunden: $ZIP_PATH" exit 1 fi if [ -z "$PASSWORD" ]; then read -r -s -p "Passwort für $EMAIL @ $URL: " PASSWORD echo fi echo "→ Login als $EMAIL @ $URL" LOGIN_RESPONSE="$(curl -sS -X POST "$URL/api/auth/login" \ -H 'Content-Type: application/json' \ --data-raw "$(E="$EMAIL" P="$PASSWORD" python3 -c 'import json,os;print(json.dumps({"email":os.environ["E"],"password":os.environ["P"]}))')")" TOKEN="$(printf '%s' "$LOGIN_RESPONSE" | python3 -c 'import json,sys;d=json.load(sys.stdin);print((d.get("data") or {}).get("token","") or d.get("token",""))')" if [ -z "$TOKEN" ]; then echo "✗ Login fehlgeschlagen. Antwort:" echo "$LOGIN_RESPONSE" | head -c 500 echo exit 1 fi echo "→ Upload + Import: $(basename "$ZIP_PATH")" RESPONSE="$(curl -sS -X POST "$URL/api/factory-defaults/import" \ -H "Authorization: Bearer $TOKEN" \ -F "zip=@$ZIP_PATH")" # Hübsch ausgeben + auf success prüfen if ! printf '%s' "$RESPONSE" | python3 -c ' import json, sys r = json.load(sys.stdin) if not r.get("success"): print("✗ Import fehlgeschlagen:", r.get("error", "(unbekannt)")) sys.exit(1) d = r.get("data", {}) print("✓ Import erfolgreich:") for label, key in [ ("Anbieter", "providers"), ("Tarife", "tariffs"), ("Kündigungsfristen", "cancellationPeriods"), ("Laufzeiten", "contractDurations"), ("Vertragskategorien","contractCategories"), ("PDF-Vorlagen", "pdfTemplates"), ("HTML-Templates", "appSettings"), ]: print(f" {label}: {d.get(key, 0)}") skipped = d.get("pdfTemplatesSkipped", 0) if skipped: print(f" (PDF-Vorlagen übersprungen: {skipped})") warnings = d.get("warnings", []) or [] if warnings: print("Hinweise:") for w in warnings: print(f" - {w}") '; then exit 1 fi # --save-as-builtin: ZIP zusätzlich in backend/factory-defaults/ entpacken, # damit der nächste Image-Build sie als Werkseinstellung mitnimmt. # Vorher räumen wir auf (außer README.md + .gitkeep), damit nichts Veraltetes # liegen bleibt. if [ "$SAVE_AS_BUILTIN" = "true" ]; then echo echo "→ --save-as-builtin: aktualisiere $BUILTIN_DIR/" if [ ! -d "$BUILTIN_DIR" ]; then mkdir -p "$BUILTIN_DIR" fi # Aufräumen: alles außer README.md und .gitkeep löschen find "$BUILTIN_DIR" -mindepth 1 \ \! -name 'README.md' \! -name '.gitkeep' \ -delete # ZIP entpacken (manifest.json kommt mit, ist aber harmlos) unzip -q -o "$ZIP_PATH" -d "$BUILTIN_DIR" echo "✓ Werkseinstellungen aktualisiert. Beim nächsten 'docker-compose up" echo " --build' landen sie im Image und seeden frische DBs automatisch." fi