#!/bin/bash # Migration runner for supply-intelligence # Supports both in-memory mode (no DB) and PostgreSQL mode (via DATABASE_URL) # # Usage: # ./scripts/run_migrations.sh # runs all pending migrations # ./scripts/run_migrations.sh --status # show migration status # ./scripts/run_migrations.sh --baseline # baseline an existing DB set -e PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" MIGRATIONS_DIR="${PROJECT_DIR}/migrations" DATABASE_URL="${DATABASE_URL:-}" # Resolve absolute path to migrations folder MIGRATIONS_DIR="$(cd "$MIGRATIONS_DIR" && pwd)" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $*"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } log_error() { echo -e "${RED}[ERR]${NC} $*" >&2; } run_postgres_migrations() { if [ -z "$DATABASE_URL" ]; then log_error "DATABASE_URL not set. Cannot run SQL migrations." log_info "Set DATABASE_URL to run PostgreSQL migrations." return 1 fi local conn="$DATABASE_URL" local db_name db_name=$(echo "$conn" | sed -E 's|.*/([^?]+)(\?.*)?|\1|') echo "CREATE TABLE IF NOT EXISTS schema_history ( installed_rank INTEGER PRIMARY KEY, version VARCHAR(50), description VARCHAR(200), type VARCHAR(20), script VARCHAR(1000), checksum BIGINT, installed_by VARCHAR(100), installed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, execution_time_ms BIGINT, success SMALLINT );" | PGPASSWORD="${PGPASSWORD:-}" psql -h "${PGHOST:-localhost}" -U "${PGUSER:-supply}" -d "$db_name" 2>/dev/null || true log_info "PostgreSQL migration runner ready" log_info "DB: $db_name" log_info "Migrations dir: $MIGRATIONS_DIR" local count=0 for f in "$MIGRATIONS_DIR"/*.sql; do [ -e "$f" ] || continue echo " $(basename "$f")" count=$((count + 1)) done log_info "Found $count SQL migration file(s)" } run_inmemory_migrations() { log_info "In-memory mode: migrations are embedded in application startup" log_info "Set DATABASE_URL to enable PostgreSQL migration runner" echo "" echo "Available migrations in $MIGRATIONS_DIR:" local count=0 for f in "$MIGRATIONS_DIR"/*.sql; do [ -e "$f" ] || continue echo " $(basename "$f")" count=$((count + 1)) done log_info "Total: $count migration(s)" } main() { case "${1:-}" in --status) if [ -n "$DATABASE_URL" ]; then log_info "PostgreSQL mode" run_postgres_migrations else log_info "In-memory mode (no DATABASE_URL)" run_inmemory_migrations fi ;; --baseline) log_warn "Baseline not implemented — use golang-migrate or flyway" ;; *) if [ -n "$DATABASE_URL" ]; then log_info "Running PostgreSQL migrations..." run_postgres_migrations else log_info "No DATABASE_URL — showing available migrations" run_inmemory_migrations fi ;; esac } main "$@"