#!/bin/bash # GoChat Database Migration Script # Reference: Chatwoot Rails db:migrate pattern # Uses golang-migrate for SQL migrations set -e MIGRATIONS_DIR="./migrations" DSN="${GOCHAT_DATABASE_DSN:-postgres://postgres:postgres@localhost:5432/gochat_dev?sslmode=disable}" case "$1" in create) echo "Creating database from DSN..." # Extract dbname from DSN for createdb DB_NAME=$(echo "$DSN" | sed 's|.*/||; s|\?.*||') DB_HOST=$(echo "$DSN" | sed 's|.*@||; s|:.*||') DB_PORT=$(echo "$DSN" | sed 's|.*@.*:||; s|/.*||') DB_USER=$(echo "$DSN" | sed 's|.*://||; s|:.*||') createdb -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" "${DB_NAME}" 2>/dev/null || echo "Database already exists" ;; up) echo "Running migrations up..." migrate -path "${MIGRATIONS_DIR}" -database "${DSN}" up ;; down) echo "Running migrations down..." migrate -path "${MIGRATIONS_DIR}" -database "${DSN}" down ;; force) echo "Force migration version..." migrate -path "${MIGRATIONS_DIR}" -database "${DSN}" force "$2" ;; version) echo "Current migration version:" migrate -path "${MIGRATIONS_DIR}" -database "${DSN}" version ;; *) echo "Usage: $0 {create|up|down|force|version}" exit 1 ;; esac