#!/usr/bin/env bash set -euo pipefail cd "$(dirname "$0")" PG_APP="blade-and-brawn-db" API_APP="blade-and-brawn-api" LOCAL_PORT=5433 proxy_pid="" cleanup() { if [[ -n "$proxy_pid" ]]; then kill "$proxy_pid" 2>/dev/null || true fi } trap cleanup EXIT echo "Fetching production DATABASE_URL from $API_APP..." >&2 prod_url=$(fly ssh console -a "$API_APP" -C "printenv DATABASE_URL" 2>/dev/null | grep -m1 '^postgres') if [[ -z "$prod_url" ]]; then echo "Failed to fetch DATABASE_URL from $API_APP" >&2 exit 1 fi tunneled_url=$(echo "$prod_url" | sed -E "s#@[^/]+/#@localhost:${LOCAL_PORT}/#") echo "Starting tunnel to $PG_APP on localhost:${LOCAL_PORT}..." >&2 fly proxy "${LOCAL_PORT}:5432" -a "$PG_APP" & proxy_pid=$! echo "Waiting for tunnel..." >&2 for _ in $(seq 1 30); do nc -z localhost "$LOCAL_PORT" 2>/dev/null && break sleep 0.5 done target="${1:-migrate}" case "$target" in migrate) (cd apps/api && NODE_ENV=production DATABASE_URL="$tunneled_url" bun run --env-file=../../.env.production src/database/migrate.ts latest) ;; seed) (cd apps/api && NODE_ENV=production DATABASE_URL="$tunneled_url" bun run --env-file=../../.env.production src/database/seed.ts) ;; both) (cd apps/api && NODE_ENV=production DATABASE_URL="$tunneled_url" bun run --env-file=../../.env.production src/database/migrate.ts latest) (cd apps/api && NODE_ENV=production DATABASE_URL="$tunneled_url" bun run --env-file=../../.env.production src/database/seed.ts) ;; *) echo "Usage: $0 [migrate|seed|both]" >&2 exit 1 ;; esac