## Scripts de Base de Datos (12 archivos) - init-database.sh: Inicializacion completa con usuario y BD - init-database-v3.sh: Version con dotenv-vault - reset-database.sh: Reset BD manteniendo usuario - recreate-database.sh: Recreacion completa - cleanup-duplicados.sh, fix-duplicate-triggers.sh - verify-users.sh, verify-missions-status.sh - load-users-and-profiles.sh, DB-127-validar-gaps.sh ## Scripts de Produccion (5 archivos) - build-production.sh: Compilar backend y frontend - deploy-production.sh: Desplegar con PM2 - pre-deploy-check.sh: Validaciones pre-deploy - repair-missing-data.sh: Reparar datos faltantes - migrate-missing-objects.sh: Migrar objetos SQL ## Documentacion (7 archivos) - GUIA-DESPLIEGUE-PRODUCCION-COMPLETA.md - GUIA-ACTUALIZACION-PRODUCCION.md - GUIA-VALIDACION-PRODUCCION.md - GUIA-DEPLOYMENT-AGENTE-PRODUCCION.md - GUIA-SSL-NGINX-PRODUCCION.md - GUIA-SSL-AUTOFIRMADO.md - DIRECTIVA-DEPLOYMENT.md ## Actualizaciones DDL/Seeds - 99-post-ddl-permissions.sql: Permisos actualizados - LOAD-SEEDS-gamification_system.sh: Seeds completos ## Nuevos archivos - PROMPT-AGENTE-PRODUCCION.md: Prompt para agente productivo - FLUJO-CARGA-LIMPIA.md: Documentacion de carga limpia Resuelve: Problema de carga de BD entre dev y produccion Cumple: DIRECTIVA-POLITICA-CARGA-LIMPIA.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
290 lines
12 KiB
Bash
Executable File
290 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
# ==============================================================================
|
|
# Script: cleanup-duplicados.sh
|
|
# Propósito: Eliminar duplicados detectados en análisis de dependencias
|
|
# Generado: 2025-11-07
|
|
# Autor: NEXUS-DATABASE-AVANZADO
|
|
# Documentación: /gamilit/orchestration/05-validaciones/database/ANALISIS-DEPENDENCIAS-DUPLICADOS-2025-11-07.md
|
|
# ==============================================================================
|
|
|
|
set -e # Exit on error
|
|
set -u # Exit on undefined variable
|
|
|
|
# Colores para output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Configuración
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
|
BACKUP_DIR="$PROJECT_ROOT/apps/database/backups/duplicados/2025-11-07"
|
|
DDL_DIR="$PROJECT_ROOT/apps/database/ddl"
|
|
|
|
echo -e "${BLUE}================================${NC}"
|
|
echo -e "${BLUE} CLEANUP DE DUPLICADOS - DATABASE${NC}"
|
|
echo -e "${BLUE}================================${NC}"
|
|
echo ""
|
|
|
|
# ==============================================================================
|
|
# PASO 0: Verificar ubicación
|
|
# ==============================================================================
|
|
echo -e "${YELLOW}📍 Verificando ubicación...${NC}"
|
|
if [ ! -d "$PROJECT_ROOT/apps/database" ]; then
|
|
echo -e "${RED}❌ Error: No se encuentra el directorio de database${NC}"
|
|
echo -e "${RED} Ejecutar desde: /gamilit/apps/database/scripts/${NC}"
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}✅ Ubicación correcta${NC}"
|
|
echo ""
|
|
|
|
# ==============================================================================
|
|
# PASO 1: Crear estructura de backups
|
|
# ==============================================================================
|
|
echo -e "${YELLOW}📦 PASO 1: Creando estructura de backups...${NC}"
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
cat > "$BACKUP_DIR/README.md" << 'EOF'
|
|
# Backups de Archivos Duplicados - 2025-11-07
|
|
|
|
## Razón del Backup
|
|
Archivos duplicados detectados por análisis de dependencias.
|
|
Estos archivos fueron eliminados tras confirmar que no tienen referencias activas.
|
|
|
|
## Archivos en este backup
|
|
1. `auth_get_current_user_id.sql` - Duplicado de gamilit/functions/02-get_current_user_id.sql (0 referencias)
|
|
2. `public_trg_feature_flags_updated_at.sql` - Duplicado en schema incorrecto
|
|
3. `public_trg_system_settings_updated_at.sql` - Duplicado en schema incorrecto
|
|
|
|
## Análisis Completo
|
|
Ver: `/gamilit/orchestration/05-validaciones/database/ANALISIS-DEPENDENCIAS-DUPLICADOS-2025-11-07.md`
|
|
|
|
## Versiones Canónicas (MANTENER)
|
|
1. `gamilit/functions/02-get_current_user_id.sql` - 73 referencias en DDL
|
|
2. `system_configuration/triggers/29-trg_feature_flags_updated_at.sql` - Ubicación correcta
|
|
3. `system_configuration/triggers/30-trg_system_settings_updated_at.sql` - Ubicación correcta
|
|
|
|
## Restauración (solo si es necesario)
|
|
```bash
|
|
# Restaurar función (NO RECOMENDADO - 0 referencias)
|
|
cp auth_get_current_user_id.sql ../../ddl/schemas/auth/functions/get_current_user_id.sql
|
|
|
|
# Restaurar triggers (NO RECOMENDADO - schema incorrecto)
|
|
cp public_trg_feature_flags_updated_at.sql ../../ddl/schemas/public/triggers/29-trg_feature_flags_updated_at.sql
|
|
cp public_trg_system_settings_updated_at.sql ../../ddl/schemas/public/triggers/30-trg_system_settings_updated_at.sql
|
|
```
|
|
|
|
**IMPORTANTE:** Los archivos eliminados NO tienen referencias activas o están en ubicación incorrecta.
|
|
La restauración solo debe hacerse si se detecta un error específico.
|
|
|
|
## Timestamp
|
|
- **Fecha backup:** 2025-11-07T18:45:00Z
|
|
- **Análisis basado en:** 73 referencias medidas en DDL, Backend, Frontend y Docs
|
|
- **Decisión:** Data-driven
|
|
EOF
|
|
|
|
echo -e "${GREEN}✅ Estructura de backups creada${NC}"
|
|
echo -e " Ubicación: $BACKUP_DIR"
|
|
echo ""
|
|
|
|
# ==============================================================================
|
|
# PASO 2: Realizar backups
|
|
# ==============================================================================
|
|
echo -e "${YELLOW}💾 PASO 2: Creando backups de duplicados...${NC}"
|
|
|
|
DUPLICADOS=(
|
|
"schemas/auth/functions/get_current_user_id.sql:auth_get_current_user_id.sql"
|
|
"schemas/public/triggers/29-trg_feature_flags_updated_at.sql:public_trg_feature_flags_updated_at.sql"
|
|
"schemas/public/triggers/30-trg_system_settings_updated_at.sql:public_trg_system_settings_updated_at.sql"
|
|
)
|
|
|
|
BACKUP_COUNT=0
|
|
for DUP in "${DUPLICADOS[@]}"; do
|
|
SOURCE_PATH="${DUP%%:*}"
|
|
BACKUP_NAME="${DUP##*:}"
|
|
FULL_PATH="$DDL_DIR/$SOURCE_PATH"
|
|
|
|
if [ -f "$FULL_PATH" ]; then
|
|
cp "$FULL_PATH" "$BACKUP_DIR/$BACKUP_NAME"
|
|
echo -e "${GREEN} ✅ Backup: $BACKUP_NAME${NC}"
|
|
BACKUP_COUNT=$((BACKUP_COUNT + 1))
|
|
else
|
|
echo -e "${YELLOW} ⚠️ No encontrado: $SOURCE_PATH (posiblemente ya eliminado)${NC}"
|
|
fi
|
|
done
|
|
|
|
echo -e "${GREEN}✅ Backups completados: $BACKUP_COUNT archivos${NC}"
|
|
echo ""
|
|
|
|
# ==============================================================================
|
|
# PASO 3: Verificar estado antes de eliminar
|
|
# ==============================================================================
|
|
echo -e "${YELLOW}🔍 PASO 3: Verificando estado ANTES de eliminar...${NC}"
|
|
|
|
# Contar referencias actuales
|
|
AUTH_REFS_BEFORE=$(grep -r "auth\.get_current_user_id" "$DDL_DIR" --include="*.sql" 2>/dev/null | wc -l || echo "0")
|
|
GAMILIT_REFS_BEFORE=$(grep -r "gamilit\.get_current_user_id" "$DDL_DIR" --include="*.sql" 2>/dev/null | wc -l || echo "0")
|
|
|
|
echo -e " Referencias auth.get_current_user_id: $AUTH_REFS_BEFORE"
|
|
echo -e " Referencias gamilit.get_current_user_id: $GAMILIT_REFS_BEFORE"
|
|
|
|
# Contar archivos de triggers
|
|
FEATURE_FLAGS_COUNT=$(find "$DDL_DIR" -name "*trg_feature_flags_updated_at*" 2>/dev/null | wc -l || echo "0")
|
|
SYSTEM_SETTINGS_COUNT=$(find "$DDL_DIR" -name "*trg_system_settings_updated_at*" 2>/dev/null | wc -l || echo "0")
|
|
|
|
echo -e " Archivos trg_feature_flags_updated_at: $FEATURE_FLAGS_COUNT"
|
|
echo -e " Archivos trg_system_settings_updated_at: $SYSTEM_SETTINGS_COUNT"
|
|
echo ""
|
|
|
|
# ==============================================================================
|
|
# PASO 4: Eliminar duplicados
|
|
# ==============================================================================
|
|
echo -e "${YELLOW}🗑️ PASO 4: Eliminando duplicados...${NC}"
|
|
|
|
DELETED_COUNT=0
|
|
for DUP in "${DUPLICADOS[@]}"; do
|
|
SOURCE_PATH="${DUP%%:*}"
|
|
FULL_PATH="$DDL_DIR/$SOURCE_PATH"
|
|
|
|
if [ -f "$FULL_PATH" ]; then
|
|
rm "$FULL_PATH"
|
|
echo -e "${GREEN} ✅ Eliminado: $SOURCE_PATH${NC}"
|
|
DELETED_COUNT=$((DELETED_COUNT + 1))
|
|
else
|
|
echo -e "${YELLOW} ⚠️ Ya eliminado: $SOURCE_PATH${NC}"
|
|
fi
|
|
done
|
|
|
|
echo -e "${GREEN}✅ Duplicados eliminados: $DELETED_COUNT archivos${NC}"
|
|
echo ""
|
|
|
|
# ==============================================================================
|
|
# PASO 5: Verificar integridad POST-eliminación
|
|
# ==============================================================================
|
|
echo -e "${YELLOW}✅ PASO 5: Verificando integridad POST-eliminación...${NC}"
|
|
|
|
# Verificar referencias
|
|
AUTH_REFS_AFTER=$(grep -r "auth\.get_current_user_id" "$DDL_DIR" --include="*.sql" 2>/dev/null | wc -l || echo "0")
|
|
GAMILIT_REFS_AFTER=$(grep -r "gamilit\.get_current_user_id" "$DDL_DIR" --include="*.sql" 2>/dev/null | wc -l || echo "0")
|
|
|
|
echo -e " Referencias auth.get_current_user_id: $AUTH_REFS_AFTER (esperado: 0)"
|
|
echo -e " Referencias gamilit.get_current_user_id: $GAMILIT_REFS_AFTER (esperado: 73)"
|
|
|
|
# Verificar archivos de triggers
|
|
FEATURE_FLAGS_AFTER=$(find "$DDL_DIR" -name "*trg_feature_flags_updated_at*" 2>/dev/null | wc -l || echo "0")
|
|
SYSTEM_SETTINGS_AFTER=$(find "$DDL_DIR" -name "*trg_system_settings_updated_at*" 2>/dev/null | wc -l || echo "0")
|
|
|
|
echo -e " Archivos trg_feature_flags_updated_at: $FEATURE_FLAGS_AFTER (esperado: 1)"
|
|
echo -e " Archivos trg_system_settings_updated_at: $SYSTEM_SETTINGS_AFTER (esperado: 1)"
|
|
echo ""
|
|
|
|
# ==============================================================================
|
|
# PASO 6: Validación de resultados
|
|
# ==============================================================================
|
|
echo -e "${YELLOW}🎯 PASO 6: Validando resultados...${NC}"
|
|
|
|
ERRORS=0
|
|
|
|
# Validar función
|
|
if [ "$AUTH_REFS_AFTER" -ne 0 ]; then
|
|
echo -e "${RED} ❌ FALLO: auth.get_current_user_id tiene $AUTH_REFS_AFTER referencias (esperado: 0)${NC}"
|
|
ERRORS=$((ERRORS + 1))
|
|
else
|
|
echo -e "${GREEN} ✅ auth.get_current_user_id: 0 referencias${NC}"
|
|
fi
|
|
|
|
if [ "$GAMILIT_REFS_AFTER" -eq 73 ]; then
|
|
echo -e "${GREEN} ✅ gamilit.get_current_user_id: 73 referencias${NC}"
|
|
elif [ "$GAMILIT_REFS_AFTER" -gt 70 ]; then
|
|
echo -e "${YELLOW} ⚠️ gamilit.get_current_user_id: $GAMILIT_REFS_AFTER referencias (esperado: 73, aceptable)${NC}"
|
|
else
|
|
echo -e "${RED} ❌ FALLO: gamilit.get_current_user_id tiene $GAMILIT_REFS_AFTER referencias (esperado: 73)${NC}"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
|
|
# Validar triggers
|
|
if [ "$FEATURE_FLAGS_AFTER" -eq 1 ]; then
|
|
echo -e "${GREEN} ✅ trg_feature_flags_updated_at: 1 archivo${NC}"
|
|
else
|
|
echo -e "${RED} ❌ FALLO: trg_feature_flags_updated_at tiene $FEATURE_FLAGS_AFTER archivos (esperado: 1)${NC}"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
|
|
if [ "$SYSTEM_SETTINGS_AFTER" -eq 1 ]; then
|
|
echo -e "${GREEN} ✅ trg_system_settings_updated_at: 1 archivo${NC}"
|
|
else
|
|
echo -e "${RED} ❌ FALLO: trg_system_settings_updated_at tiene $SYSTEM_SETTINGS_AFTER archivos (esperado: 1)${NC}"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# ==============================================================================
|
|
# PASO 7: Listar archivos preservados
|
|
# ==============================================================================
|
|
echo -e "${YELLOW}📋 PASO 7: Verificando archivos preservados...${NC}"
|
|
|
|
CANONICOS=(
|
|
"schemas/gamilit/functions/02-get_current_user_id.sql:gamilit.get_current_user_id()"
|
|
"schemas/system_configuration/triggers/29-trg_feature_flags_updated_at.sql:trg_feature_flags_updated_at"
|
|
"schemas/system_configuration/triggers/30-trg_system_settings_updated_at.sql:trg_system_settings_updated_at"
|
|
)
|
|
|
|
for CANONICO in "${CANONICOS[@]}"; do
|
|
FILE_PATH="${CANONICO%%:*}"
|
|
FUNC_NAME="${CANONICO##*:}"
|
|
FULL_PATH="$DDL_DIR/$FILE_PATH"
|
|
|
|
if [ -f "$FULL_PATH" ]; then
|
|
echo -e "${GREEN} ✅ $FUNC_NAME${NC}"
|
|
echo -e " $FILE_PATH"
|
|
else
|
|
echo -e "${RED} ❌ FALLO: No se encuentra $FUNC_NAME${NC}"
|
|
echo -e "${RED} $FILE_PATH${NC}"
|
|
ERRORS=$((ERRORS + 1))
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
|
|
# ==============================================================================
|
|
# RESUMEN FINAL
|
|
# ==============================================================================
|
|
echo -e "${BLUE}================================${NC}"
|
|
echo -e "${BLUE} RESUMEN FINAL${NC}"
|
|
echo -e "${BLUE}================================${NC}"
|
|
echo ""
|
|
|
|
echo -e "📊 Estadísticas:"
|
|
echo -e " - Archivos respaldados: $BACKUP_COUNT"
|
|
echo -e " - Archivos eliminados: $DELETED_COUNT"
|
|
echo -e " - Archivos preservados: 3"
|
|
echo -e " - Errores detectados: $ERRORS"
|
|
echo ""
|
|
|
|
echo -e "📁 Backups guardados en:"
|
|
echo -e " $BACKUP_DIR"
|
|
echo ""
|
|
|
|
if [ $ERRORS -eq 0 ]; then
|
|
echo -e "${GREEN}🎉 PROCESO COMPLETADO EXITOSAMENTE${NC}"
|
|
echo -e "${GREEN}✅ 0 duplicados restantes${NC}"
|
|
echo -e "${GREEN}✅ Integridad verificada${NC}"
|
|
echo -e ""
|
|
echo -e "${BLUE}📚 Ver análisis completo:${NC}"
|
|
echo -e " orchestration/05-validaciones/database/ANALISIS-DEPENDENCIAS-DUPLICADOS-2025-11-07.md"
|
|
exit 0
|
|
else
|
|
echo -e "${RED}❌ PROCESO COMPLETADO CON ERRORES${NC}"
|
|
echo -e "${RED} Errores encontrados: $ERRORS${NC}"
|
|
echo -e ""
|
|
echo -e "${YELLOW}⚠️ Acciones recomendadas:${NC}"
|
|
echo -e " 1. Revisar archivos preservados"
|
|
echo -e " 2. Verificar backups en: $BACKUP_DIR"
|
|
echo -e " 3. Consultar análisis: orchestration/05-validaciones/database/ANALISIS-DEPENDENCIAS-DUPLICADOS-2025-11-07.md"
|
|
exit 1
|
|
fi
|