workspace/projects/gamilit/scripts/repair-missing-data.sh
rckrdmrd a23f31ce8f feat(db): Sincronizar scripts de BD y documentacion de produccion
## 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>
2025-12-18 15:01:03 -06:00

239 lines
9.4 KiB
Bash
Executable File

#!/bin/bash
# ============================================================================
# GAMILIT - Script de Reparacion de Datos Faltantes
# ============================================================================
# Uso: ./scripts/repair-missing-data.sh
#
# Este script verifica y repara datos faltantes en produccion:
# - Tenants (critico para registro)
# - Modulos educativos
# - Rangos Maya
# - Feature flags
# - Otros datos de configuracion
#
# Variables de entorno requeridas:
# DATABASE_URL - URL de conexion a PostgreSQL
#
# IMPORTANTE: Este script es SEGURO de ejecutar multiples veces.
# Usa ON CONFLICT para evitar duplicados.
#
# ============================================================================
set -e
# Colores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Configuracion
DATABASE_URL="${DATABASE_URL:-postgresql://gamilit_user:PASSWORD@localhost:5432/gamilit_platform}"
# Obtener directorio del script
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
DB_DIR="$PROJECT_DIR/apps/database"
echo -e "${BLUE}"
echo "=============================================="
echo " REPARACION DE DATOS FALTANTES - GAMILIT"
echo "=============================================="
echo -e "${NC}"
echo "Fecha: $(date)"
echo "Database: ${DATABASE_URL%%@*}@..."
echo ""
# Verificar conexion
echo -e "${YELLOW}Verificando conexion a BD...${NC}"
if ! psql "$DATABASE_URL" -c "SELECT 1;" > /dev/null 2>&1; then
echo -e "${RED}ERROR: No se puede conectar a la base de datos${NC}"
echo "Verifica DATABASE_URL y que PostgreSQL este corriendo"
exit 1
fi
echo -e "${GREEN}Conexion OK${NC}"
echo ""
# ============================================================================
# 1. VERIFICAR Y REPARAR TENANTS
# ============================================================================
echo -e "${YELLOW}=== 1. Verificando Tenants ===${NC}"
tenant_count=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM auth_management.tenants WHERE is_active = true;" 2>/dev/null | tr -d ' ')
main_tenant=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM auth_management.tenants WHERE slug = 'gamilit-prod';" 2>/dev/null | tr -d ' ')
if [ "$main_tenant" -eq 0 ]; then
echo -e "${RED}❌ Tenant principal 'gamilit-prod' NO existe${NC}"
echo "Cargando seeds de tenants..."
if [ -f "$DB_DIR/seeds/prod/auth_management/01-tenants.sql" ]; then
psql "$DATABASE_URL" -f "$DB_DIR/seeds/prod/auth_management/01-tenants.sql" > /dev/null 2>&1
echo -e "${GREEN}✅ Tenant principal cargado${NC}"
else
echo -e "${RED}ERROR: No se encuentra el archivo de seeds${NC}"
echo "Path esperado: $DB_DIR/seeds/prod/auth_management/01-tenants.sql"
fi
if [ -f "$DB_DIR/seeds/prod/auth_management/02-tenants-production.sql" ]; then
psql "$DATABASE_URL" -f "$DB_DIR/seeds/prod/auth_management/02-tenants-production.sql" > /dev/null 2>&1
echo -e "${GREEN}✅ Tenants de produccion cargados${NC}"
fi
else
echo -e "${GREEN}✅ Tenant principal existe ($tenant_count tenants activos)${NC}"
fi
echo ""
# ============================================================================
# 2. VERIFICAR Y REPARAR MODULOS
# ============================================================================
echo -e "${YELLOW}=== 2. Verificando Modulos Educativos ===${NC}"
module_count=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM educational_content.modules;" 2>/dev/null | tr -d ' ')
if [ "$module_count" -lt 5 ]; then
echo -e "${YELLOW}⚠️ Modulos incompletos ($module_count de 5)${NC}"
echo "Cargando seeds de modulos..."
if [ -f "$DB_DIR/seeds/prod/educational_content/01-modules.sql" ]; then
psql "$DATABASE_URL" -f "$DB_DIR/seeds/prod/educational_content/01-modules.sql" > /dev/null 2>&1
echo -e "${GREEN}✅ Modulos cargados${NC}"
else
echo -e "${RED}ERROR: No se encuentra el archivo de seeds${NC}"
fi
else
echo -e "${GREEN}✅ Modulos OK ($module_count)${NC}"
fi
echo ""
# ============================================================================
# 3. VERIFICAR Y REPARAR RANGOS MAYA
# ============================================================================
echo -e "${YELLOW}=== 3. Verificando Rangos Maya ===${NC}"
rank_count=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM gamification_system.maya_ranks;" 2>/dev/null | tr -d ' ')
if [ "$rank_count" -lt 5 ]; then
echo -e "${YELLOW}⚠️ Rangos Maya incompletos ($rank_count de 5)${NC}"
echo "Cargando seeds de rangos..."
if [ -f "$DB_DIR/seeds/prod/gamification_system/03-maya_ranks.sql" ]; then
psql "$DATABASE_URL" -f "$DB_DIR/seeds/prod/gamification_system/03-maya_ranks.sql" > /dev/null 2>&1
echo -e "${GREEN}✅ Rangos Maya cargados${NC}"
else
echo -e "${RED}ERROR: No se encuentra el archivo de seeds${NC}"
fi
else
echo -e "${GREEN}✅ Rangos Maya OK ($rank_count)${NC}"
fi
echo ""
# ============================================================================
# 4. VERIFICAR Y REPARAR FEATURE FLAGS
# ============================================================================
echo -e "${YELLOW}=== 4. Verificando Feature Flags ===${NC}"
flag_count=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM system_configuration.feature_flags;" 2>/dev/null | tr -d ' ')
if [ "$flag_count" -lt 20 ]; then
echo -e "${YELLOW}⚠️ Feature flags incompletos ($flag_count)${NC}"
echo "Cargando seeds de feature flags..."
if [ -f "$DB_DIR/seeds/prod/system_configuration/01-feature_flags_seeds.sql" ]; then
psql "$DATABASE_URL" -f "$DB_DIR/seeds/prod/system_configuration/01-feature_flags_seeds.sql" > /dev/null 2>&1
echo -e "${GREEN}✅ Feature flags cargados${NC}"
else
echo -e "${RED}ERROR: No se encuentra el archivo de seeds${NC}"
fi
else
echo -e "${GREEN}✅ Feature flags OK ($flag_count)${NC}"
fi
echo ""
# ============================================================================
# 5. VERIFICAR Y REPARAR LOGROS
# ============================================================================
echo -e "${YELLOW}=== 5. Verificando Logros ===${NC}"
achievement_count=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM gamification_system.achievements;" 2>/dev/null | tr -d ' ')
if [ "$achievement_count" -lt 25 ]; then
echo -e "${YELLOW}⚠️ Logros incompletos ($achievement_count)${NC}"
echo "Cargando seeds de logros..."
# Primero categorias
if [ -f "$DB_DIR/seeds/prod/gamification_system/01-achievement_categories.sql" ]; then
psql "$DATABASE_URL" -f "$DB_DIR/seeds/prod/gamification_system/01-achievement_categories.sql" > /dev/null 2>&1
fi
# Luego logros
if [ -f "$DB_DIR/seeds/prod/gamification_system/04-achievements.sql" ]; then
psql "$DATABASE_URL" -f "$DB_DIR/seeds/prod/gamification_system/04-achievements.sql" > /dev/null 2>&1
echo -e "${GREEN}✅ Logros cargados${NC}"
else
echo -e "${RED}ERROR: No se encuentra el archivo de seeds${NC}"
fi
else
echo -e "${GREEN}✅ Logros OK ($achievement_count)${NC}"
fi
echo ""
# ============================================================================
# 6. VERIFICAR TIENDA
# ============================================================================
echo -e "${YELLOW}=== 6. Verificando Tienda ===${NC}"
shop_categories=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM gamification_system.shop_categories;" 2>/dev/null | tr -d ' ')
shop_items=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM gamification_system.shop_items;" 2>/dev/null | tr -d ' ')
if [ "$shop_categories" -lt 3 ] || [ "$shop_items" -lt 15 ]; then
echo -e "${YELLOW}⚠️ Tienda incompleta (categorias: $shop_categories, items: $shop_items)${NC}"
echo "Cargando seeds de tienda..."
if [ -f "$DB_DIR/seeds/prod/gamification_system/12-shop_categories.sql" ]; then
psql "$DATABASE_URL" -f "$DB_DIR/seeds/prod/gamification_system/12-shop_categories.sql" > /dev/null 2>&1
fi
if [ -f "$DB_DIR/seeds/prod/gamification_system/13-shop_items.sql" ]; then
psql "$DATABASE_URL" -f "$DB_DIR/seeds/prod/gamification_system/13-shop_items.sql" > /dev/null 2>&1
echo -e "${GREEN}✅ Tienda cargada${NC}"
fi
else
echo -e "${GREEN}✅ Tienda OK (categorias: $shop_categories, items: $shop_items)${NC}"
fi
echo ""
# ============================================================================
# RESUMEN FINAL
# ============================================================================
echo -e "${BLUE}"
echo "=============================================="
echo " REPARACION COMPLETADA"
echo "=============================================="
echo -e "${NC}"
echo "Resumen de datos:"
psql "$DATABASE_URL" -c "
SELECT
'Tenants' as entidad, COUNT(*) as total FROM auth_management.tenants
UNION ALL
SELECT 'Usuarios', COUNT(*) FROM auth.users
UNION ALL
SELECT 'Perfiles', COUNT(*) FROM auth_management.profiles
UNION ALL
SELECT 'Modulos', COUNT(*) FROM educational_content.modules
UNION ALL
SELECT 'Ejercicios', COUNT(*) FROM educational_content.exercises
UNION ALL
SELECT 'Rangos Maya', COUNT(*) FROM gamification_system.maya_ranks
UNION ALL
SELECT 'Logros', COUNT(*) FROM gamification_system.achievements
UNION ALL
SELECT 'Feature Flags', COUNT(*) FROM system_configuration.feature_flags;
"
echo ""
echo -e "${YELLOW}IMPORTANTE: Si se cargaron datos, reiniciar el backend:${NC}"
echo " pm2 restart gamilit-backend"
echo ""