michangarrito/database/scripts/recreate-database.sh
rckrdmrd 5a49ad0185 [INTEGRATION] feat: Integrate template-saas scopes and database objects
## Documentation
- Align MCH-029 to MCH-032 with template-saas modules (SAAS-008 to SAAS-015)
- Create MCH-034 (Analytics) and MCH-035 (Reports) from SAAS-016/017
- Update PLAN-DESARROLLO.md with Phase 7 and 8
- Update _MAP.md indexes (35 total epics)

## Database (5 new schemas, 14 tables)
- Add storage schema: buckets, files, signed_urls
- Add webhooks schema: endpoints, deliveries
- Add audit schema: logs, retention_policies
- Add features schema: flags, tenant_flags (14 seeds)
- Add analytics schema: metrics, events, reports, report_schedules
- Add auth.oauth_connections for MCH-030
- Add timestamptz_to_date() IMMUTABLE function
- Update EXPECTED_SCHEMAS in recreate-database.sh

## Analysis Reports
- ANALISIS-INTEGRACION-TEMPLATE-SAAS-2026-01-13.md
- VALIDACION-COHERENCIA-2026-01-13.md
- GAP-ANALYSIS-BD-2026-01-13.md
- REPORTE-EJECUCION-2026-01-13.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 07:10:55 -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" "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 ""