package main import ( "context" "fmt" "os" "time" "git.netcell-it.de/projekte/edgeguard-native/internal/database" ) // cmdMigrate fans out to the subcommand handlers. `check` is offline // (filename validation against the embedded FS) and is the safe // pre-flight call from postinst — it catches duplicate version // prefixes before the DB ever gets touched. func cmdMigrate(args []string) int { if len(args) == 0 { fmt.Fprintln(os.Stderr, "Usage: edgeguard-ctl migrate up|down|check|dump [dir]") return 2 } if args[0] == "check" { if err := database.ValidateMigrations(); err != nil { fmt.Fprintln(os.Stderr, "migrate check:", err) return 1 } fmt.Println("embedded migrations OK") return 0 } ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() switch args[0] { case "up": if err := database.Migrate(ctx, ""); err != nil { fmt.Fprintln(os.Stderr, "migrate up:", err) return 1 } fmt.Println("migrations applied") return 0 case "down": if err := database.MigrateDown(ctx, ""); err != nil { fmt.Fprintln(os.Stderr, "migrate down:", err) return 1 } fmt.Println("one migration rolled back") return 0 case "dump": dst := "./migrations" if len(args) >= 2 { dst = args[1] } if err := database.CopyEmbeddedMigrationsTo(dst); err != nil { fmt.Fprintln(os.Stderr, "migrate dump:", err) return 1 } fmt.Println("embedded migrations written to", dst) return 0 default: fmt.Fprintln(os.Stderr, "Usage: edgeguard-ctl migrate up|down|check|dump [dir]") return 2 } }