#!/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" "storage" "webhooks" "audit" "features" "analytics") 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 ""