#!/bin/bash # 00-init-schema.sh # Initialize PostgreSQL with module schema for testing # Sprint: SPRINT_20260105_002_005_TEST_cross_cutting # Task: CCUT-008 set -e echo "Initializing schema for module: ${STELLAOPS_MODULE}" echo "Schema version: ${STELLAOPS_SCHEMA_VERSION}" # Create extensions psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS "pgcrypto"; CREATE EXTENSION IF NOT EXISTS "btree_gist"; EOSQL # Apply base schema if exists BASE_SCHEMA="/schemas/${STELLAOPS_MODULE}/base.sql" if [ -f "$BASE_SCHEMA" ]; then echo "Applying base schema: $BASE_SCHEMA" psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$BASE_SCHEMA" fi # Apply versioned schema if exists VERSION_SCHEMA="/schemas/${STELLAOPS_MODULE}/${STELLAOPS_SCHEMA_VERSION}.sql" if [ -f "$VERSION_SCHEMA" ]; then echo "Applying version schema: $VERSION_SCHEMA" psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$VERSION_SCHEMA" fi # Apply all migrations up to version MIGRATIONS_DIR="/schemas/${STELLAOPS_MODULE}/migrations" if [ -d "$MIGRATIONS_DIR" ]; then echo "Applying migrations from: $MIGRATIONS_DIR" # Get version number for comparison VERSION_NUM=$(echo "$STELLAOPS_SCHEMA_VERSION" | sed 's/v//' | sed 's/\.//g') for migration in $(ls -1 "$MIGRATIONS_DIR"/*.sql 2>/dev/null | sort -V); do MIGRATION_VERSION=$(basename "$migration" .sql | sed 's/[^0-9]//g') if [ -n "$VERSION_NUM" ] && [ "$MIGRATION_VERSION" -gt "$VERSION_NUM" ]; then echo "Skipping migration $migration (version $MIGRATION_VERSION > $VERSION_NUM)" continue fi echo "Applying migration: $migration" psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$migration" done fi # Record schema version in metadata table psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL CREATE TABLE IF NOT EXISTS _schema_metadata ( key TEXT PRIMARY KEY, value TEXT NOT NULL, updated_at TIMESTAMPTZ DEFAULT NOW() ); INSERT INTO _schema_metadata (key, value) VALUES ('module', '${STELLAOPS_MODULE}'), ('schema_version', '${STELLAOPS_SCHEMA_VERSION}'), ('initialized_at', NOW()::TEXT) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, updated_at = NOW(); EOSQL echo "Schema initialization complete for ${STELLAOPS_MODULE} version ${STELLAOPS_SCHEMA_VERSION}"