Gamilit: - Backend: Teacher services, assignments, gamification, exercise submissions - Frontend: Admin/Teacher/Student portals, module 4-5 mechanics, monitoring - Database: DDL functions, seeds for dev/prod, auth/gamification schemas - Docs: Architecture, features, guides cleanup and reorganization Core/Orchestration: - New workspace directives index - Documentation directive Trading-platform: - Database seeds and inventory updates - Tech leader validation report 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
9.1 KiB
ANALISIS: Teacher Monitoring Page - Problemas de Paginacion y Datos
Fecha: 2025-12-18 Analista: Requirements-Analyst Proyecto: Gamilit Componente: Teacher Portal - Monitoring Page Version: 1.0
RESUMEN EJECUTIVO
Se ha identificado un problema critico en la pagina de monitoreo del portal teacher donde:
- Solo se muestran 20 estudiantes cuando hay 44+ estudiantes registrados en produccion
- Los datos mostrados no corresponden a la base de datos real debido a campos no poblados
PROBLEMA REPORTADO
"En la carga de datos iniciales hay mas de 30 usuarios, pero solo se muestran 20. Ademas los datos mostrados no son los correctos o tomados de la base de datos."
ANALISIS DETALLADO
1. PROBLEMA DE PAGINACION (LIMITE DE 20)
Causa Raiz
El backend tiene un limite por defecto de 20 registros y el frontend NO pasa parametros de paginacion.
Evidencia - Backend Service
Archivo: apps/backend/src/modules/teacher/services/teacher-classrooms-crud.service.ts:253
async getClassroomStudents(...) {
const { page = 1, limit = 20, search, status, ... } = query;
// El limite por defecto es 20
}
Evidencia - Frontend Hooks
Archivo: apps/frontend/src/apps/teacher/hooks/useClassrooms.ts:57-63
const fetchClassroomStudents = useCallback(async (classroomId: string) => {
const response = await classroomsApi.getClassroomStudents(classroomId);
// NO PASA query params - usa valores por defecto del backend (limit=20)
});
Archivo: apps/frontend/src/apps/teacher/hooks/useStudentMonitoring.ts:67
const response = await classroomsApi.getClassroomStudents(classroomId, query);
// query no incluye page/limit en la mayoria de los casos
Impacto
- 44 estudiantes en produccion
- Solo 20 mostrados (primeros por orden de paginacion)
- 24 estudiantes invisibles en la UI
2. PROBLEMA DE DATOS NO CORRECTOS
Causa Raiz
El mapeo del servicio backend NO popula los campos adicionales definidos en el DTO.
Evidencia - DTO vs Implementacion
DTO Definido: apps/backend/src/modules/teacher/dto/classroom-response.dto.ts:197-316
Campos definidos en StudentInClassroomDto:
| Campo | Definido en DTO | Implementado en Service |
|---|---|---|
| user_id | SI | SI |
| full_name | SI | SI |
| SI | SI | |
| avatar | SI | SI |
| enrollment_date | SI | SI |
| status | SI | SI |
| progress_percentage | SI | PARCIAL (solo module_progress.avg) |
| score_average | SI | PARCIAL (solo module_progress.avg) |
| last_activity | SI | INCORRECTO (usa updated_at) |
| attendance_percentage | SI | SI |
| teacher_notes | SI | SI |
| current_module | SI | NO IMPLEMENTADO |
| current_exercise | SI | NO IMPLEMENTADO |
| time_spent_minutes | SI | NO IMPLEMENTADO |
| exercises_completed | SI | NO IMPLEMENTADO |
| exercises_total | SI | NO IMPLEMENTADO |
| total_ml_coins | SI | NO IMPLEMENTADO |
| current_rank | SI | NO IMPLEMENTADO |
| achievements_count | SI | NO IMPLEMENTADO |
Evidencia - Funcion de Mapeo
Archivo: apps/backend/src/modules/teacher/services/teacher-classrooms-crud.service.ts:963-986
private mapToStudentInClassroomDto(
member: ClassroomMember,
profile?: Profile,
user?: User,
progress?: { progress: number; score: number },
): StudentInClassroomDto {
return {
user_id: member.student_id,
full_name: fullName || 'Unknown Student',
email: user?.email,
avatar: profile?.avatar_url || undefined,
enrollment_date: member.enrollment_date,
status: member.status,
progress_percentage: progress?.progress,
score_average: progress?.score,
last_activity: member.updated_at, // INCORRECTO: deberia ser actividad real
attendance_percentage: member.attendance_percentage || undefined,
teacher_notes: member.teacher_notes || undefined,
// FALTAN: current_module, current_exercise, time_spent_minutes, etc.
};
}
3. PROBLEMA DE MAPEO FRONTEND
Causa Raiz
Discrepancia entre tipos del frontend y respuesta del backend.
Evidencia - Tipos Frontend
Archivo: apps/frontend/src/apps/teacher/types/index.ts:5-21
export interface StudentMonitoring {
id: string; // Frontend espera 'id'
user_id?: string; // Backend envia 'user_id'
full_name: string;
email: string;
status: StudentStatus;
current_module: string | null; // No viene del backend
current_exercise: string | null; // No viene del backend
last_activity: string;
progress_percentage: number; // Backend envia como opcional
score_average: number; // Backend envia como opcional
time_spent_minutes: number; // No viene del backend
exercises_completed: number; // No viene del backend
exercises_total: number; // No viene del backend
}
Problemas Especificos
- Frontend espera
id, backend enviauser_id - Frontend espera tipos no-opcionales, backend envia opcionales
- Campos faltantes causan valores undefined en la UI
ARQUITECTURA DEL FLUJO DE DATOS
[Base de Datos]
|
| (44+ estudiantes en classroom_members)
v
[Backend Service: getClassroomStudents]
|
| query.limit = 20 (por defecto)
| Solo obtiene datos basicos de:
| - classroom_members
| - profiles (auth_management)
| - users (auth)
| - module_progress (parcial)
v
[Backend Response: PaginatedStudentsResponseDto]
|
| Envia 20 estudiantes con campos incompletos
v
[Frontend API: classroomsApi.getClassroomStudents]
|
| No pasa page/limit
v
[Frontend Hook: useClassrooms / useStudentMonitoring]
|
| Recibe solo 20 estudiantes
v
[Frontend Component: StudentMonitoringPanel]
|
| Muestra datos incompletos
v
[UI: Solo 20 de 44 estudiantes visibles]
COMPONENTES AFECTADOS
Frontend
| Archivo | Tipo | Impacto |
|---|---|---|
apps/frontend/src/apps/teacher/pages/TeacherMonitoringPage.tsx |
Page | Afectado |
apps/frontend/src/apps/teacher/hooks/useClassrooms.ts |
Hook | REQUIERE CORRECCION |
apps/frontend/src/apps/teacher/hooks/useStudentMonitoring.ts |
Hook | REQUIERE CORRECCION |
apps/frontend/src/apps/teacher/components/monitoring/StudentMonitoringPanel.tsx |
Component | Afectado |
apps/frontend/src/apps/teacher/components/monitoring/StudentStatusCard.tsx |
Component | Afectado |
apps/frontend/src/apps/teacher/components/monitoring/StudentDetailModal.tsx |
Component | Afectado |
apps/frontend/src/services/api/teacher/classroomsApi.ts |
API | Afectado |
apps/frontend/src/apps/teacher/types/index.ts |
Types | REQUIERE REVISION |
Backend
| Archivo | Tipo | Impacto |
|---|---|---|
apps/backend/src/modules/teacher/services/teacher-classrooms-crud.service.ts |
Service | REQUIERE CORRECCION |
apps/backend/src/modules/teacher/dto/classroom-response.dto.ts |
DTO | Ya definido correctamente |
apps/backend/src/modules/teacher/controllers/teacher-classrooms.controller.ts |
Controller | OK |
Base de Datos (Seeds)
| Archivo | Tipo | Cantidad |
|---|---|---|
apps/database/seeds/prod/auth/02-production-users.sql |
Seed | 44 usuarios estudiantes |
apps/database/seeds/dev/social_features/03-classroom-members.sql |
Seed | Todos asignados a DEFAULT |
DATOS DE VERIFICACION
Usuarios en Base de Datos
- Total usuarios produccion: 44 estudiantes
- Usuarios testing (@gamilit.com): 3 (admin, teacher, student)
- Total general: 47 usuarios
Classroom DEFAULT
- Todos los estudiantes se asignan automaticamente al classroom DEFAULT
- El script de seed hace INSERT con ON CONFLICT DO UPDATE
DEPENDENCIAS IDENTIFICADAS
Para Poblar Campos Faltantes
-
current_module / current_exercise:
- Requiere query a
progress_tracking.exercise_submissions(ultima submission) - O query a
progress_tracking.module_progress(modulo actual)
- Requiere query a
-
time_spent_minutes:
- Requiere agregar
time_spentdemodule_progress - O calcular desde
exercise_submissions
- Requiere agregar
-
exercises_completed / exercises_total:
- Requiere query a
exercise_submissions(COUNT con is_correct = true) - Total desde
educational_content.exercisesasignados
- Requiere query a
-
total_ml_coins:
- Query a
gamification_system.user_stats.total_ml_coins
- Query a
-
current_rank:
- Query a
gamification_system.user_ranks(JOIN conmaya_ranks)
- Query a
-
achievements_count:
- Query a
gamification_system.user_achievements(COUNT)
- Query a
CONCLUSION
El problema tiene dos dimensiones:
- Paginacion: Solucion directa - pasar limit alto o implementar paginacion completa
- Datos incorrectos: Requiere implementar queries adicionales en el backend para poblar todos los campos del DTO
REFERENCIAS
- Frontend Types:
apps/frontend/src/apps/teacher/types/index.ts - Backend DTO:
apps/backend/src/modules/teacher/dto/classroom-response.dto.ts - Backend Service:
apps/backend/src/modules/teacher/services/teacher-classrooms-crud.service.ts - API Endpoint:
GET /api/v1/teacher/classrooms/:id/students
Siguiente Fase: Planeacion de Implementaciones/Correcciones