# Solución Final - AdminRolesPage Error 500 **Fecha:** 2025-11-24 **Analista:** Architecture-Analyst **Problema:** Error 500 en `/admin/roles` y AdminReportsPage no funciona --- ## 🔍 DIAGNÓSTICO El error 500 en AdminRolesPage NO es causado por el endpoint `/admin/roles`, sino por un **problema de base de datos desincronizada** con el código: **Error Real:** ``` QueryFailedError: column Exercise.requires_manual_grading does not exist ``` **Causa Raíz:** - La entity `Exercise.entity.ts` tiene columna `requires_manual_grading` - La tabla `educational_content.exercises` en la base de datos NO tiene esa columna - TypeORM intenta hacer SELECT con una columna que no existe → Error 500 - Esto ocurre cuando el frontend carga y hace múltiples peticiones en paralelo --- ## ✅ SOLUCIÓN ### Paso 1: Regenerar Base de Datos Completa ```bash # Desde la raíz del proyecto (/home/isem/workspace/workspace-gamilit/gamilit/projects/gamilit) cd apps/database # Regenerar base de datos completa (DROP + CREATE + SEEDS) DATABASE_URL="postgresql://gamilit_user:3RZ2uYhCnJBXQqEwPPbZK3NFfk4T4W4Q@localhost:5432/gamilit_platform" ./drop-and-recreate-database.sh ``` **Esperar:** ~2-3 minutos para que termine **Verificar que terminó correctamente:** ```bash # Debe mostrar al final: ✅ BASE DE DATOS RECREADA EXITOSAMENTE ✅ Objetos creados en schema educational_content: XX ``` ### Paso 2: Reiniciar Backend ```bash # 1. Matar todos los procesos backend existentes pkill -f "npm run dev" lsof -ti:3006 | xargs kill -9 # 2. Desde directorio backend cd /home/isem/workspace/workspace-gamilit/gamilit/projects/gamilit/apps/backend # 3. Iniciar backend limpio npm run dev ``` **Esperar:** "Nest application successfully started" ### Paso 3: Reiniciar Frontend ```bash # Desde directorio frontend cd /home/isem/workspace/workspace-gamilit/gamilit/projects/gamilit/apps/frontend # Reiniciar (Ctrl+C si está corriendo, luego) npm run dev ``` **Abrir:** http://localhost:3005/admin ### Paso 4: Probar AdminRolesPage 1. Login como admin: - Email: `admin@gamilit.com` - Password: `Test1234` 2. Navegar a: http://localhost:3005/admin/roles 3. **Verificar:** - ✅ NO hay error 404 en `/admin/roles/permissions` - ✅ NO hay error 500 en `/admin/roles` - ✅ Se cargan roles (student, admin_teacher, super_admin) - ✅ Al seleccionar rol, se muestran permisos ### Paso 5: Probar AdminReportsPage 1. Navegar a: http://localhost:3005/admin/reports 2. **Verificar:** - ✅ Se muestra BetaBanner (advertencia de almacenamiento en memoria) - ✅ Formulario de generación visible - ✅ Generar reporte de prueba (Users, CSV) - ✅ Reporte aparece en lista - ✅ Auto-refresh funciona cada 5 segundos - ✅ Cuando completa, botón Download funciona --- ## 📋 CORRECCIONES APLICADAS EN CÓDIGO ### 1. Frontend - Endpoint Incorrecto (404) **Archivo:** `apps/frontend/src/config/api.config.ts` **Línea:** 233 ```typescript // ANTES (INCORRECTO) availablePermissions: '/admin/roles/available-permissions', // DESPUÉS (CORRECTO) availablePermissions: '/admin/roles/permissions', ``` ### 2. Backend - Error 500 en getRoles **Archivo:** `apps/backend/src/modules/admin/services/admin-roles.service.ts` **Líneas:** 30-73 **Cambio:** Agregado mapeo de role names a enum values con try-catch ```typescript // Mapeo de nombres de roles a valores del enum const roleNameToEnum: Record = { 'student': 'student', 'teacher': 'admin_teacher', 'admin': 'super_admin', 'super_admin': 'super_admin', 'admin_teacher': 'admin_teacher', }; // Try-catch para roles sin mapeo try { usersCount = await this.userRoleRepo.count({ where: { role: enumValue as any, is_active: true }, }); } catch (error) { console.warn(`Could not count users for role ${role.name}:`, error); usersCount = 0; } ``` --- ## 🧪 VALIDACIÓN FINAL ### ✅ Checklist **Base de Datos:** - [ ] Script drop-and-recreate terminó sin errores - [ ] Columna `requires_manual_grading` existe en `educational_content.exercises` - [ ] Seeds de usuarios cargados correctamente **Backend:** - [ ] Backend arranca sin errores - [ ] Health check responde: `curl http://localhost:3006/api/v1/health` - [ ] Login funciona: `admin@gamilit.com` / `Test1234` **AdminRolesPage:** - [ ] Página carga sin error 404 o 500 - [ ] Lista de roles se muestra - [ ] Permisos se cargan por rol - [ ] Contador de usuarios funciona **AdminReportsPage:** - [ ] BetaBanner visible - [ ] Formulario de generación funciona - [ ] Reportes se generan y aparecen en lista - [ ] Auto-refresh funciona - [ ] Descarga funciona --- ## ⚠️ SI SIGUE FALLANDO ### Error Persiste Después de Regenerar BD ```bash # 1. Verificar que la columna existe PGPASSWORD='3RZ2uYhCnJBXQqEwPPbZK3NFfk4T4W4Q' psql \ -h localhost \ -U gamilit_user \ -d gamilit_platform \ -c "\d educational_content.exercises" | grep requires_manual_grading # Debe mostrar: # requires_manual_grading | boolean | not null | false ``` ### Error de Backend NO Arranca ```bash # Verificar que no hay procesos zombie ps aux | grep node | grep backend # Matar todos pkill -9 -f backend # Verificar que puerto 3006 está libre lsof -ti:3006 # No debe mostrar nada # Reiniciar backend cd apps/backend && npm run dev ``` ### Error de Autenticación ```bash # Verificar que usuario admin existe PGPASSWORD='3RZ2uYhCnJBXQqEwPPbZK3NFfk4T4W4Q' psql \ -h localhost \ -U gamilit_user \ -d gamilit_platform \ -c "SELECT email, gamilit_role FROM auth.users WHERE email='admin@gamilit.com';" # Debe mostrar: # admin@gamilit.com | super_admin ``` --- ## 📝 RESUMEN **Problema Real:** Base de datos desincronizada con código TypeORM **Síntomas:** - Error 500 en múltiples endpoints - Frontend muestra errores aunque el código esté correcto - Columnas faltantes en tablas **Solución:** Regenerar base de datos completa con script oficial **Tiempo estimado:** 5-10 minutos totales **Archivos modificados:** 1. ✅ `api.config.ts` - Corregido endpoint de permissions 2. ✅ `admin-roles.service.ts` - Agregado mapeo robusto de roles **Status:** ✅ Correcciones aplicadas, requiere regeneración de BD --- ## 🚀 COMANDO RÁPIDO (TODO EN UNO) ```bash # Ejecutar desde raíz del proyecto cd /home/isem/workspace/workspace-gamilit/gamilit/projects/gamilit # 1. Regenerar BD cd apps/database && DATABASE_URL="postgresql://gamilit_user:3RZ2uYhCnJBXQqEwPPbZK3NFfk4T4W4Q@localhost:5432/gamilit_platform" ./drop-and-recreate-database.sh # 2. Esperar que termine (2-3 min) # 3. Matar procesos backend pkill -f "npm run dev"; lsof -ti:3006 | xargs kill -9 2>/dev/null # 4. Reiniciar backend cd ../backend && npm run dev & # 5. Reiniciar frontend (en otra terminal) cd ../frontend && npm run dev # 6. Abrir http://localhost:3005/admin # 7. Login: admin@gamilit.com / Test1234 # 8. Probar /admin/roles y /admin/reports ``` --- **Analista:** Architecture-Analyst **Fecha:** 2025-11-24 **Status:** ✅ SOLUCIÓN DEFINITIVA - Requiere regeneración de BD --- **Nota Final:** El problema NO era el código del Admin Portal, sino la base de datos que no tenía las columnas actualizadas. Después de regenerar la BD, ambas páginas funcionarán correctamente.