✨ Características: - 45 ejercicios universitarios (Basic → Advanced) - Renderizado LaTeX profesional - IA generativa (Z.ai/DashScope) - Docker 9 servicios - Tests 123/123 pasando - Seguridad enterprise (JWT, XSS, Rate limiting) 🐳 Infraestructura: - Next.js 14 + Node.js 20 - PostgreSQL 15 + Redis 7 - Docker Compose completo - Nginx + SSL ready 📚 Documentación: - 5 informes técnicos completos - README profesional - Scripts de deployment automatizados Estado: Producción lista ✅
3.6 KiB
3.6 KiB
Tareas para Kimi - Sprint 2 🏃♂️
(Math2 Platform - Fixes Post-Remediación)
Kimi, tu informe anterior (INFORME_FINAL_REMEDIACION.md) muestra gran progreso, pero debido a los cambios en el cliente de Prisma y las relaciones, introdujiste 4 regresiones en los tests de integración del backend (tests/integration/exercise.integration.test.ts).
Tu objetivo para este sprint corto es solucionar estos bloqueantes y dejar el suite de tests 100% en verde.
🛑 BUGS A RESOLVER (Prioridad P0)
1. Fix en Ranking Global (Argument moduleId must not be null)
- Archivo:
backend/src/modules/ranking/ranking.service.ts(aprox. línea 229) - El Problema: Al buscar la posición global del usuario, estás enviando
moduleId: nulldentro de unprisma.ranking.findUnique. Las versiones recientes de Prisma restringen las búsquedasfindUniqueen índices compuestos si un campo es nulo. - La Solución: Cambia la llamada lógica de
findUniqueafindFirst.// Cambiar esto: const previousGlobal = await prisma.ranking.findUnique({ where: { userId_moduleId: { userId, moduleId: null } } }); // Por esto: const previousGlobal = await prisma.ranking.findFirst({ where: { userId, moduleId: null } });
2. Race Condition en Envíos Concurrentes (AttemptNumber)
- Archivo:
backend/src/modules/exercise/exercise.service.ts(métodosubmitAttempt) - El Problema: El test de "Concurrent submission handling" lanza un error Unique constraint failed en
(userId, exerciseId, attemptNumber). Actualmente estás contando los intentos previos (prisma.exerciseAttempt.count) fuera de la transacción principal. Si 5 requests entran a la vez, todos leen un count de0, usanattemptNumber = 1y chocan en la inserción. - La Solución: Mueve el conteo de los intentos previos (y por consecuencia, la variable
attemptNumber) DENTRO del bloqueawait prisma.$transaction(async (tx) => { ... }).- Asegúrate de usar
tx.exerciseAttempt.counten su lugar. - Al contar dentro de la transacción serializable, Prisma garantizará el aislamiento y la correctitud del número.
- Ojo: la lógica completa de feedback y
ScoreCalculator.calculatetambién deberán estar dentro o ajustarse, porque dependen delattemptNumberfinal.
- Asegúrate de usar
3. Aserciones de Paginación Rotas en Tests
- Archivo:
backend/tests/integration/exercise.integration.test.ts(Línea 312) - El Problema: El test intenta leer
response.body.data.attempts.length. Sin embargo, la refactorización reciente del EndpointGET /api/exercises/:id/attemptsdevolvió el array directamente en la raíz dedata(y la banderahasCompletedse movió a la llavemeta). - La Solución: Cambiar las expectativas en el test para que coincidan con la firma actual del Controller:
(Nota: O si prefieres, revierte la respuesta del Controller a devolver la llave
// Viejo test expect(response.body.data.attempts.length).toBeGreaterThanOrEqual(1); expect(response.body.data.hasCompleted).toBe(true); // Nuevo test expect(response.body.data.length).toBeGreaterThanOrEqual(1); expect(response.body.meta.hasCompleted).toBe(true);attemptsdentro dedatasi ese era el contrato de API original).
🧹 TAREAS MENORES (Prioridad P1)
- Ejecuta
npm run testy valida que pases los 123 tests sin arrojarPrismaClientValidationErroroAssertionError. - Verifica qué dependencias rotas quedan reportadas en
npx tsc --noEmitdespués de arreglar estos 3 puntos.
¡A por el cierre del Backend, Kimi!