michangarrito/database/scripts/recreate-database.sh
rckrdmrd 97f407c661 [MIGRATION-V2] feat: Migrar michangarrito a estructura v2
- Prefijo v2: MCH
- TRACEABILITY-MASTER.yml creado
- Listo para integracion como submodulo

Workspace: v2.0.0 | SIMCO: v4.0.0
2026-01-10 11:28:54 -06:00

178 lines
6.8 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# MiChangarrito - Script de Recreación de Base de Datos
# =============================================================================
# Versión: 1.0.0
# Fecha: 2026-01-05
# Autor: @PERFIL_DEVENV
# =============================================================================
# DESCRIPCION:
# Elimina y recrea la base de datos completamente.
# Útil para validar cambios en schemas o resetear el ambiente.
#
# USO:
# ./recreate-database.sh # Modo interactivo
# ./recreate-database.sh --force # Sin confirmación
# ./recreate-database.sh --validate # Ejecuta validación después
#
# PREREQUISITOS:
# - PostgreSQL 15+ instalado y corriendo
# - Script create-database.sh disponible
# =============================================================================
set -e
# Colores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
# Flags
FORCE=false
VALIDATE=false
# Parsear argumentos
for arg in "$@"; do
case $arg in
--force)
FORCE=true
shift
;;
--validate)
VALIDATE=true
shift
;;
--help|-h)
echo "Uso: $0 [--force] [--validate]"
echo " --force No pedir confirmación"
echo " --validate Ejecutar validación al terminar"
exit 0
;;
esac
done
# Detectar directorio del script
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DATABASE_DIR="$(dirname "$SCRIPT_DIR")"
# Banner
echo ""
echo -e "${RED}╔══════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║ MICHANGARRITO - RECREACIÓN DE BASE DE DATOS ║${NC}"
echo -e "${RED}║ ⚠️ OPERACIÓN DESTRUCTIVA ║${NC}"
echo -e "${RED}╚══════════════════════════════════════════════════════════════════╝${NC}"
echo ""
# Advertencia
echo -e "${YELLOW}ADVERTENCIA: Esta operación:${NC}"
echo " 1. ELIMINARÁ todos los datos existentes"
echo " 2. Recreará la estructura completa"
echo " 3. Ejecutará todos los seeds"
echo ""
# Confirmación (a menos que --force)
if [ "$FORCE" = false ]; then
read -p "¿Estás seguro de continuar? (escribe 'RECREAR' para confirmar): " confirm
if [ "$confirm" != "RECREAR" ]; then
echo -e "${RED}Operación cancelada.${NC}"
exit 0
fi
fi
# Registrar inicio
START_TIME=$(date +%s)
echo ""
echo -e "${CYAN}Iniciando recreación: $(date '+%Y-%m-%d %H:%M:%S')${NC}"
echo ""
# Ejecutar create-database.sh con --force
echo -e "${YELLOW}Ejecutando create-database.sh...${NC}"
echo ""
if [ -f "$SCRIPT_DIR/create-database.sh" ]; then
chmod +x "$SCRIPT_DIR/create-database.sh"
"$SCRIPT_DIR/create-database.sh" --force
else
echo -e "${RED}Error: create-database.sh no encontrado${NC}"
exit 1
fi
# Calcular tiempo
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
echo ""
echo -e "${CYAN}Recreación completada en ${DURATION} segundos${NC}"
echo ""
# Validación opcional
if [ "$VALIDATE" = true ]; then
echo -e "${YELLOW}Ejecutando validación...${NC}"
echo ""
if [ -f "$SCRIPT_DIR/validate-database.sh" ]; then
chmod +x "$SCRIPT_DIR/validate-database.sh"
"$SCRIPT_DIR/validate-database.sh"
else
# Validación inline básica
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
DB_NAME="${DB_NAME:-michangarrito_dev}"
DB_USER="${DB_USER:-michangarrito_dev}"
DB_PASSWORD="${DB_PASSWORD:-MCh_dev_2025_secure}"
echo -e "${CYAN}Validación básica:${NC}"
# Contar schemas
SCHEMA_COUNT=$(PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -tAc "SELECT count(*) FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema';" 2>/dev/null || echo "0")
echo " Schemas: $SCHEMA_COUNT"
# Contar tablas
TABLE_COUNT=$(PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -tAc "SELECT count(*) FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema');" 2>/dev/null || echo "0")
echo " Tablas: $TABLE_COUNT"
# Contar funciones
FUNC_COUNT=$(PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -tAc "SELECT count(*) FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid WHERE n.nspname NOT LIKE 'pg_%' AND n.nspname != 'information_schema';" 2>/dev/null || echo "0")
echo " Funciones: $FUNC_COUNT"
# Contar triggers
TRIGGER_COUNT=$(PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -tAc "SELECT count(*) FROM information_schema.triggers WHERE trigger_schema NOT IN ('pg_catalog', 'information_schema');" 2>/dev/null || echo "0")
echo " Triggers: $TRIGGER_COUNT"
echo ""
# Validar schemas esperados
EXPECTED_SCHEMAS=("public" "auth" "catalog" "sales" "inventory" "customers" "orders" "subscriptions" "messaging")
MISSING_SCHEMAS=0
echo -e "${CYAN}Schemas esperados:${NC}"
for schema in "${EXPECTED_SCHEMAS[@]}"; do
EXISTS=$(PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -tAc "SELECT 1 FROM pg_namespace WHERE nspname='$schema';" 2>/dev/null || echo "")
if [ "$EXISTS" = "1" ]; then
echo -e " [${GREEN}${NC}] $schema"
else
echo -e " [${RED}${NC}] $schema"
((MISSING_SCHEMAS++))
fi
done
echo ""
if [ $MISSING_SCHEMAS -eq 0 ]; then
echo -e "${GREEN}✓ Validación exitosa: Todos los schemas existen${NC}"
else
echo -e "${RED}✗ Validación fallida: $MISSING_SCHEMAS schemas faltantes${NC}"
exit 1
fi
fi
fi
echo ""
echo -e "${GREEN}╔══════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ RECREACIÓN COMPLETADA EXITOSAMENTE ║${NC}"
echo -e "${GREEN}╚══════════════════════════════════════════════════════════════════╝${NC}"
echo ""