Entrega 1 Trazabilidad - JuanVargas0325/Prueba GitHub Wiki
Entrega 1 – Trazabilidad: requisito → código
Grupo N° completar · Integrantes
Para cada exigencia del enunciado se indica dónde está implementada y dónde se prueba. Las rutas son relativas a
backend/internal/salvo que se indique otra cosa.
Cómo leer las capas: el dominio contiene la regla pura (sin base de datos ni HTTP), el servicio la aplica en el caso de uso junto con los permisos, el handler expone el endpoint y el repositorio persiste. Las pruebas están junto al código (*_test.go), más la colección de Postman (postman/) y las pruebas de integración (repositorio/integracion_test.go).
1. Requerimientos funcionales
RF-01 · Autenticación y acceso
| Requisito | Implementación | Endpoint | Pruebas |
|---|---|---|---|
| RF-01.1 Inicio de sesión local | servicio/autenticacion.go → IniciarSesion; auth/auth.go → VerificarPassword (bcrypt), GestorTokens.Generar (JWT) |
POST /api/v1/auth/login |
servicio/autenticacion_test.go, auth/auth_test.go |
| RF-01.2 Control de acceso por rol | handler/middleware.go → Autenticar, RequiereRol; cada handler declara sus roles en Registrar |
todas las rutas protegidas | handler/router_test.go → TestControlDeAccesoPorRol |
| RF-01.3 Varios roles por persona | dominio/usuario.go → Usuario.Roles, TieneRol; tabla usuario_roles |
— | auth/auth_test.go → TestTokenIdaYVuelta |
RF-02 y RF-15.2 · Gestión de usuarios (administrador)
| Requisito | Implementación | Endpoint | Pruebas |
|---|---|---|---|
| RF-02.1 Crear usuarios | servicio/usuarios.go → Crear (valida nombre, correo, contraseña y roles) |
POST /api/v1/usuarios |
servicio/modulos_test.go → TestCrearUsuario |
| RF-02.2 Asignar roles | servicio/usuarios.go → AsignarRoles (impide quitar un rol en uso o el propio rol de administrador) |
PUT /api/v1/usuarios/{id}/roles |
TestAsignarRoles |
| RF-02.3 Consulta global | servicio/usuarios.go → Listar, Obtener; repositorio/usuarios.go → Listar |
GET /api/v1/usuarios |
repositorio/integracion_test.go → TestUsuarios |
| Administrador inicial | servicio/autenticacion.go → AsegurarAdministrador (variables ADMIN_*) |
— | TestAsegurarAdministrador |
RF-03 · Cursos y proyectos
| Requisito | Implementación | Endpoint | Pruebas |
|---|---|---|---|
| RF-03.1 Crear cursos y proyectos | servicio/espacios.go → Crear |
POST /api/v1/espacios |
TestCrearEspacio |
| RF-03.2 Solo en un período habilitado; períodos explícitos | dominio/espacio.go → PermiteCrearEspacios, ValidarFechasEnPeriodo; servicio/periodos.go |
POST/GET/PATCH /api/v1/periodos |
dominio/reglas_test.go → TestPeriodoPermiteCrearEspacios; TestPeriodos |
| RF-03.3 Información mínima | dominio.Espacio (nombre, período, fechas, profesor, observaciones) |
— | TestCrearEspacio |
| RF-03.4 Consultar sus espacios | servicio/espacios.go → Listar (filtro VisiblePara) |
GET /api/v1/espacios |
TestVisibilidadYCierreDeEspacios |
| RF-03.5 Cerrar | servicio/espacios.go → Cerrar; repositorio/espacios.go → Cerrar |
POST /api/v1/espacios/{id}/cerrar |
TestEspaciosVisibilidadYCierre |
| RF-03.6 Consultar cerrados (solo lectura) | handler/espacios.go → campo solo_lectura |
GET /api/v1/espacios/{id} |
Postman, carpeta 9 |
| RF-03.7 Sin registros en espacios cerrados | dominio/espacio.go → PermiteRegistros, usado al vincular y al crear o editar tareas |
— | TestCrearVinculacion, TestModificarTareas |
RF-04 y RF-05 · Vinculaciones y reglas de horas
| Requisito | Implementación | Endpoint | Pruebas |
|---|---|---|---|
| RF-04.1 a 04.3 Vinculación manual con rol y horas | servicio/vinculaciones.go → Crear (por usuario_id o correo) |
POST /api/v1/vinculaciones |
TestCrearVinculacion |
| RF-04.4 Horas no modificables | No existe ningún endpoint de edición para el profesor; solo la rectificación del administrador | — | Postman: "El profesor no puede modificar horas" |
| RF-04.5 Rectificación (administrador) | servicio/vinculaciones.go → Rectificar; repositorio/vinculaciones.go → Rectificar (guarda el historial) |
PUT /api/v1/vinculaciones/{id}, GET …/rectificaciones |
TestRectificarVinculacion; TestVinculacionesReglasYConcurrencia |
| RF-04.6 Vinculaciones independientes | Tabla vinculaciones con UNIQUE (usuario_id, espacio_id, rol) |
— | TestVinculacionesReglasYConcurrencia |
| RF-05.1 Máximo 22 h de asistencia | dominio/vinculacion.go → ValidarCargaHoraria |
— | dominio/reglas_test.go → TestValidarCargaHoraria |
| RF-05.2 Máximo 3 monitorías | ValidarCargaHoraria |
— | TestValidarCargaHoraria |
| RF-05.3 Máximo 12 h de monitoría | ValidarCargaHoraria |
— | TestValidarCargaHoraria |
| RF-05.4 y 05.5 Regla del 40 % con redondeo hacia arriba | dominio/vinculacion.go → LimiteMonitoriaMixta |
— | TestLimiteMonitoriaMixtaRedondeaHaciaArriba (22 h → 9 h; 12 h → 5 h) |
| RF-05.6 Validaciones bloqueantes | repositorio/vinculaciones.go → Crear y Rectificar: transacción con SELECT … FOR UPDATE sobre el usuario y validador dominio.ValidadorCarga |
responde 422 | TestVinculacionesReglasYConcurrencia (dos vinculaciones simultáneas: solo una pasa) |
RF-06 a RF-08 · Tareas semanales, estados y semanas
| Requisito | Implementación | Endpoint | Pruebas |
|---|---|---|---|
| RF-06.1 Crear tareas | servicio/tareas.go → Crear |
POST /api/v1/tareas |
TestCrearTareaEnLaSemanaActual |
| RF-06.2 Una sola vinculación | tareas.vinculacion_id; el servicio verifica que la vinculación sea propia |
— | TestCrearTareaValidaciones |
| RF-06.3 Información mínima | dominio/tarea.go → DatosTarea.Normalizar |
— | TestDatosTareaNormalizar |
| RF-06.4 Adjuntos | servicio/tareas.go → guardarArchivos, AgregarAdjuntos, AbrirAdjunto; dominio/tarea.go → ValidarArchivoAdjunto; almacenamiento/local.go |
POST/GET/DELETE /api/v1/tareas/{id}/adjuntos… (también en la creación, como multipart) |
TestCrearTareaConAdjuntos, handler/modulos_test.go → TestCrearTareaConAdjuntosMultipart |
| RF-06.5 Horas enteras | Campo int en JSON (un decimal responde 400) |
— | TestCrearTareaRechazaHorasNoEnterasYCamposDesconocidos |
| RF-06.6 Varias tareas por semana | Sin restricción de unicidad por semana | — | Postman, carpeta 6 |
| RF-06.7 y 06.8 Editar y eliminar en la semana activa | servicio/tareas.go → Actualizar, Eliminar, verificarModificable |
PUT/DELETE /api/v1/tareas/{id} |
TestModificarTareas |
| RF-06.9 Nuevo registro para otra semana | La semana y la vinculación no se editan (Tarea.Aplicar solo cambia los datos) |
— | TestModificarTareas |
| RF-07.1 y 07.2 Estados abierto, en desarrollo, finalizado | dominio/tarea.go → EstadoTarea; CHECK en la tabla |
— | TestDatosTareaNormalizar |
| RF-08.1 Semana de lunes a domingo | dominio/semana.go → InicioSemana, FinSemana, SemanaActual (zona APP_ZONA_HORARIA) |
— | dominio/semana_test.go |
| RF-08.2 Operaciones en la semana activa | dominio/tarea.go → PuedeModificarse |
— | TestTareaPuedeModificarse |
| RF-08.3 Semanas anteriores | dominio/tarea.go → ValidarSemanaDeRegistro (solo rechaza semanas futuras) |
— | TestValidarSemanaDeRegistro |
| RF-08.4 Marca de tardanza | servicio/tareas.go → Crear (Tardia = SemanaCerrada(...)) |
— | TestCrearTareaEnSemanaPasadaEsTardia |
| RF-08.5 Tardía inmutable | Tarea.PuedeModificarse; además el repositorio solo actualiza o elimina con tardia = FALSE |
— | TestModificarTareas, TestTareasYAdjuntos |
RF-09 a RF-12 · Seguimiento y visibilidad
| Requisito | Implementación | Endpoint | Pruebas |
|---|---|---|---|
| RF-09 Estado "sin reporte" (adelantado) | dominio/seguimiento.go → ConstruirSemanas, estadoSemana |
GET /api/v1/seguimiento/personas/{id}/semanas |
TestConstruirSemanasDetectaSinReporte |
| RF-10.1 y 10.2 Personas a cargo y sus vinculaciones | servicio/seguimiento.go → PersonasACargo; dominio.AgruparPorPersona |
GET /api/v1/seguimiento/personas |
TestPersonasACargo |
| RF-10.3 Detalle semanal | servicio/seguimiento.go → SemanasPersona |
GET …/personas/{id}/semanas |
TestSemanasPersonaVisibilidadYRango |
| RF-10.4 Vista consolidada | servicio/seguimiento.go → Consolidado; dominio.ConstruirConsolidado |
GET …/personas/{id}/consolidado |
TestConstruirConsolidado |
| RF-10.5 Tareas de sus personas | servicio/tareas.go → Listar |
GET /api/v1/tareas?usuario_id= |
Postman, carpeta 6 |
| RF-10.6 Horas reportadas frente a contratadas | dominio.SemanaPersona (HorasContratadas, HorasReportadas) |
…/semanas |
TestConstruirSemanasDetectaSinReporte |
| RF-11.1 Listado unificado del monitor | servicio/vinculaciones.go → Listar y servicio/espacios.go → Listar |
GET /api/v1/vinculaciones, GET /api/v1/espacios |
Postman, carpeta 4 |
| RF-11.2 Solo sus tareas | Tareas.Listar con VisiblePara |
GET /api/v1/tareas |
TestTareasYAdjuntos |
| RF-11.3 Historial | servicio/seguimiento.go → SemanasPersona sobre el propio usuario |
GET /api/v1/seguimiento/mi-historial |
handler/modulos_test.go → TestSeguimiento |
| RF-12.1 a 12.3 Visibilidad por profesor, usuario y administrador | servicio/acceso.go → visiblePara, puedeVerDeProfesor; filtros VisiblePara en los repositorios |
todas | TestReporteDeOtroProfesorNoEsVisible, TestVisibilidadDeVinculaciones, TestSemanasPersonaVisibilidadYRango |
RF-14 · Reportes semanales con IA
| Requisito | Implementación | Endpoint | Pruebas |
|---|---|---|---|
| RF-14.1 Ejecución manual por lotes | servicio/reportes.go → SolicitarLote; cola/cola.go → EncolarLote |
POST /api/v1/reportes/lotes (202) |
TestSolicitarLoteNormalizaLaSemanaYEncola |
| RF-14.2 Un reporte por persona | servicio/generacion_reportes.go → ProcesarLote (worker) |
— | TestProcesarLoteCreaYEncolaUnReportePorPersona |
| RF-14.3 Solo los insumos permitidos | ia/prompt.go → ConstruirMensajeUsuario (sin nombre, correo ni horas contratadas) |
— | ia/ia_test.go → TestMensajeUsuarioIncluyeSoloInsumosPermitidos |
| RF-14.4 PDF | pdf/generador.go → Generar |
— | pdf/generador_test.go |
| RF-14.5 Almacenar los PDF | servicio/generacion_reportes.go → GenerarReporte + almacenamiento/local.go |
— | TestGenerarReporteCompleto |
| RF-14.6 Descarga posterior | servicio/reportes.go → AbrirPDF |
GET /api/v1/reportes/{id}/pdf |
TestDescargarPDF |
| RF-14.7 Una semana concreta | dominio.InicioSemana sobre la fecha solicitada |
— | TestSolicitarLoteNormalizaLaSemanaYEncola |
| Proveedor de IA configurable | ia/ia.go → Nuevo (simulado, openai, anthropic) |
— | TestNuevoValidaConfiguracion, TestOpenAI…, TestAnthropic… |
| Reintentos y fallos | cola/cola.go → ejecutar; servicio.EsErrorPermanente |
— | cola/cola_test.go, TestEsErrorPermanente |
RF-15 · Administración
RF-15.1 (visibilidad global) se cubre con visiblePara (vacío para el administrador); RF-15.2 con el módulo de usuarios; y RF-15.3 con Vinculaciones.Rectificar.
2. Reglas de negocio destacadas
| Regla | Dónde se aplica |
|---|---|
| RN-02 Rol por vinculación | vinculaciones.rol; verificarPersonaVinculable exige además el rol global |
| RN-07 Creación solo en la ventana del período | PeriodoAcademico.PermiteCrearEspacios (creacion_habilitada) |
| RN-09 Espacio cerrado = solo consulta | Espacio.PermiteRegistros |
| RN-12 Horas inmutables | Solo Rectificar (administrador), con motivo y registro |
| RN-14 a RN-19 Horas | ValidarCargaHoraria + transacción con bloqueo |
| RN-26 Continuidad entre semanas | La semana no se edita |
| RN-29 a RN-34 Semanas, tardanza e inmutabilidad | dominio/semana.go, dominio/tarea.go |
| RN-35 a RN-37 "Sin reporte" derivado | dominio/seguimiento.go (no se almacena) |
| RN-41 a RN-46 Reportes con IA | servicio/generacion_reportes.go, ia/prompt.go (instrucciones: no evaluar el desempeño) |
3. Requerimientos no funcionales y stack
| Exigencia | Evidencia |
|---|---|
| RNF-01 Aplicación web sencilla con backend sólido | Arquitectura en tres capas con dominio puro |
| RNF-03 Autenticación local y roles | auth/, handler/middleware.go |
| RNF-04 Persistencia de tareas, vinculaciones y PDF | PostgreSQL + volumen archivos |
| RNF-05 Mantenibilidad | Un archivo por módulo en cada capa; golangci-lint y SonarQube con 0 hallazgos |
| RNF-06 Consistencia del negocio | Reglas en el dominio, transacciones y CHECK en la base de datos |
| Go + Gin | backend/go.mod, handler/ |
| PostgreSQL | basedatos/, repositorio/ |
| Linux Debian | backend/Dockerfile (debian:bookworm-slim), imágenes *-bookworm |
| Docker y Docker Compose | backend/Dockerfile, docker-compose.yml |
| Nginx | nginx/nginx.conf |
| Asynq + Redis | cola/, cmd/worker/ |
| LLM | ia/ |
4. Entregables de la Entrega 1
| Entregable | Evidencia |
|---|---|
| Backend según la especificación | backend/ (este documento) |
Dockerfile y docker-compose.yml |
backend/Dockerfile, docker-compose.yml |
| Pruebas unitarias | backend/internal/**/*_test.go |
| Pipeline de GitHub Actions | .github/workflows/ci.yml |
| SonarQube | Etapa "Análisis SonarQube" del pipeline (artefacto reporte-sonarqube) |
| Documento de arquitectura | Entrega 1 – Arquitectura |
| Documento de deuda técnica | Entrega 1 – Deuda técnica |
| Pruebas con Postman | postman/seguimiento.postman_collection.json (también en CI) |
| Pruebas de carga | pruebas-carga/ y Entrega 1 – Pruebas de carga |