#!/bin/bash ############################################################################### # Script de Migración de Objetos Faltantes de Base de Datos # # Migra objetos SQL desde el directorio origen al destino # basado en el análisis de OBJETOS-FALTANTES-DETALLADO.csv # # Uso: ./migrate-missing-objects.sh [fase] # fase: critica | alta | media | todas ############################################################################### set -e # Exit on error # Colores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Directorios ORIGEN_BASE="/home/isem/workspace/projects/gamilit-docs/03-desarrollo/base-de-datos/backup-ddl/gamilit_platform" DESTINO_BASE="/home/isem/workspace/gamilit/projects/gamilit/apps/database/ddl" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" # Archivos de log LOG_DIR="$PROJECT_ROOT/logs/migration" mkdir -p "$LOG_DIR" LOG_FILE="$LOG_DIR/migration-$(date +%Y%m%d-%H%M%S).log" # Función de logging log() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE" } log_error() { echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE" } log_info() { echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$LOG_FILE" } # Función para migrar un objeto migrate_object() { local schema=$1 local tipo=$2 local nombre=$3 local prioridad=$4 local origen_file="$ORIGEN_BASE/schemas/$schema/$tipo/$nombre.sql" local destino_dir="$DESTINO_BASE/schemas/$schema/$tipo" local destino_file="$destino_dir/$nombre.sql" # Verificar si archivo origen existe if [ ! -f "$origen_file" ]; then log_warning "Archivo origen no encontrado: $origen_file" return 1 fi # Crear directorio destino si no existe if [ ! -d "$destino_dir" ]; then log_info "Creando directorio: $destino_dir" mkdir -p "$destino_dir" fi # Verificar si ya existe en destino if [ -f "$destino_file" ]; then log_warning "Archivo ya existe en destino: $destino_file (SKIP)" return 0 fi # Copiar archivo log "Migrando: $schema/$tipo/$nombre.sql [$prioridad]" cp "$origen_file" "$destino_file" # Verificar copia exitosa if [ -f "$destino_file" ]; then log " ✓ Migrado exitosamente" echo "$schema,$tipo,$nombre,$prioridad,$(date +%Y-%m-%d)" >> "$LOG_DIR/migrated-objects.log" return 0 else log_error " ✗ Error al copiar archivo" return 1 fi } # Función para migrar por prioridad migrate_by_priority() { local priority=$1 local count=0 local success=0 local failed=0 log "==================================================" log "MIGRANDO OBJETOS CON PRIORIDAD: $priority" log "==================================================" # Leer CSV y filtrar por prioridad while IFS=, read -r schema tipo nombre prioridad impacto archivo accion; do # Skip header if [[ "$schema" == "Schema" ]]; then continue fi # Filtrar por prioridad if [[ "$prioridad" != "$priority" ]]; then continue fi ((count++)) if migrate_object "$schema" "$tipo" "$nombre" "$prioridad"; then ((success++)) else ((failed++)) fi done < "$PROJECT_ROOT/OBJETOS-FALTANTES-DETALLADO.csv" log "" log "Resumen de migración [$priority]:" log " Total procesados: $count" log " Exitosos: $success" log " Fallidos: $failed" log "" } # Función para migrar seed data migrate_seed_data() { log "==================================================" log "MIGRANDO SEED DATA" log "==================================================" local seed_origen="$ORIGEN_BASE/seed-data" local seed_destino="$DESTINO_BASE/seed-data" if [ ! -d "$seed_origen" ]; then log_error "Directorio de seed data origen no encontrado: $seed_origen" return 1 fi # Crear directorio destino mkdir -p "$seed_destino" # Copiar toda la estructura de seeds log "Copiando archivos de seed data..." local total_files=0 local total_size=0 for schema_dir in "$seed_origen"/*; do if [ -d "$schema_dir" ]; then schema_name=$(basename "$schema_dir") mkdir -p "$seed_destino/$schema_name" for seed_file in "$schema_dir"/*.sql; do if [ -f "$seed_file" ]; then file_name=$(basename "$seed_file") file_size=$(stat -f%z "$seed_file" 2>/dev/null || stat -c%s "$seed_file") log " Copiando: $schema_name/$file_name ($(numfmt --to=iec-i --suffix=B $file_size 2>/dev/null || echo $file_size bytes))" cp "$seed_file" "$seed_destino/$schema_name/" ((total_files++)) ((total_size+=file_size)) fi done fi done log "" log "✓ Seed data migrado:" log " Archivos: $total_files" log " Tamaño total: $(numfmt --to=iec-i --suffix=B $total_size 2>/dev/null || echo $total_size bytes)" log "" # Crear README para seeds cat > "$seed_destino/README.md" << 'EOF' # Seed Data - Datos Iniciales Este directorio contiene los datos iniciales (seed data) para la base de datos Gamilit. ## Orden de Instalación Los archivos deben ejecutarse en el siguiente orden debido a dependencias: ### 1. System Configuration ```bash psql -d gamilit_platform -f seed-data/system_configuration/01-seed-system_settings.sql psql -d gamilit_platform -f seed-data/system_configuration/02-seed-feature_flags.sql ``` ### 2. Auth Management ```bash psql -d gamilit_platform -f seed-data/auth_management/01-seed-test-users.sql ``` ### 3. Educational Content ```bash psql -d gamilit_platform -f seed-data/educational_content/01-seed-modules.sql psql -d gamilit_platform -f seed-data/educational_content/02-seed-assessment_rubrics.sql psql -d gamilit_platform -f seed-data/educational_content/03-seed-exercises.sql ``` ### 4. Gamification System ```bash psql -d gamilit_platform -f seed-data/gamification_system/00-seed-achievement_categories.sql psql -d gamilit_platform -f seed-data/gamification_system/01-seed-achievements.sql psql -d gamilit_platform -f seed-data/gamification_system/02-seed-leaderboard_metadata.sql psql -d gamilit_platform -f seed-data/gamification_system/03-seed-maya-ranks.sql psql -d gamilit_platform -f seed-data/gamification_system/01-initialize-user-gamification.sql ``` ### 5. Content Management ```bash psql -d gamilit_platform -f seed-data/content_management/01-seed-marie_curie_content.sql ``` ## Script Automatizado También puedes usar el script de instalación automatizado: ```bash ./scripts/install-seed-data.sh ``` EOF log "✓ README.md creado en seed-data/" } # Función para validar alcance de social_features validate_social_features() { log "==================================================" log "VALIDACIÓN: Social Features" log "==================================================" log_warning "El schema 'social_features' contiene 7 tablas que NO fueron migradas." log_warning "Se requiere validación con stakeholders para determinar si están en alcance del MVP." log_warning "" log_warning "Tablas afectadas:" log_warning " - 01-schools" log_warning " - 02-classrooms" log_warning " - 03-classroom_members" log_warning " - 04-teams" log_warning " - 05-team_members" log_warning " - 06-friendships" log_warning " - 07-notifications" log_warning "" log_warning "Acción requerida: Contactar a product owner para confirmar alcance." } # Función para generar reporte post-migración generate_report() { log "==================================================" log "GENERANDO REPORTE POST-MIGRACIÓN" log "==================================================" python3 /tmp/analyze_db_migration.py > /dev/null 2>&1 log "✓ Análisis actualizado generado" log " Ver: /tmp/db_migration_analysis.json" log " Ver: $PROJECT_ROOT/ANALISIS-MIGRACION-BASE-DATOS.md" } # Función principal main() { local fase=${1:-help} log "==================================================" log "SCRIPT DE MIGRACIÓN DE OBJETOS DE BASE DE DATOS" log "==================================================" log "Inicio: $(date)" log "Fase: $fase" log "" case $fase in critica) migrate_by_priority "CRITICA" ;; alta) migrate_by_priority "ALTA" ;; media) migrate_by_priority "MEDIA" ;; baja) migrate_by_priority "BAJA" ;; seeds) migrate_seed_data ;; todas|all) migrate_by_priority "CRITICA" migrate_by_priority "ALTA" migrate_by_priority "MEDIA" migrate_by_priority "BAJA" migrate_seed_data validate_social_features generate_report ;; validate) validate_social_features ;; report) generate_report ;; help|*) echo "" echo "Uso: $0 [fase]" echo "" echo "Fases disponibles:" echo " critica - Migrar solo objetos de prioridad CRÍTICA" echo " alta - Migrar solo objetos de prioridad ALTA" echo " media - Migrar solo objetos de prioridad MEDIA" echo " baja - Migrar solo objetos de prioridad BAJA" echo " seeds - Migrar solo seed data" echo " todas - Migrar TODO (recomendado)" echo " validate - Validar alcance de social_features" echo " report - Generar reporte actualizado" echo " help - Mostrar esta ayuda" echo "" echo "Ejemplos:" echo " $0 critica # Migrar solo objetos críticos" echo " $0 todas # Migración completa" echo "" exit 0 ;; esac log "" log "==================================================" log "MIGRACIÓN COMPLETADA" log "==================================================" log "Fin: $(date)" log "Log guardado en: $LOG_FILE" log "" log "Próximos pasos:" log " 1. Revisar log de migración" log " 2. Ejecutar validaciones de integridad" log " 3. Aplicar objetos migrados a la base de datos" log " 4. Ejecutar tests de integración" log "" } # Ejecutar script main "$@"