Feature: incluir urlFoto en el resumen de estudiante para quien puede ver la foto
Qué y por qué
El listado (GET /estudiantes), GET /estudiantes/{id}/resumen y GET /estudiantes/mi-perfil devuelven EstudianteResumenDTO, que no traía la ruta de la foto. El frontend tenía que armarla con el id y pedir una foto por fila, recibiendo un 404 por cada estudiante sin foto (y un 403 por cada fila para roles sin permiso). Ahora el resumen incluye urlFoto, la misma ruta que ya devuelve la ficha completa: /estudiantes/{id}/foto. ## Cambios
-
EstudianteResumenDTO: nuevo campourlFoto(+@Setter, igual queEstudianteResponseDTO). Se actualiza el javadoc, que decía "sin foto". -
EstudianteService:urlFotosolo se ofrece a quien puede pedir la foto. Se anula en el servicio, como ya se hace con el bloque confidencial enobtenerPorId, para no acoplar MapStruct aSecurityContextHolder. -
EstudianteMapper: se extraemapUrlFotopara no duplicar la expresión entretoDtoytoResumenDto. El comportamiento de la fcompleta no cambia. ## Quién veurlFoto| Endpoint | Quién |urlFoto| |---|---|---| |GET /estudiantes,GET /estudiantes/{id}/resumen| conVER_ESTUDIANTE| ruta si el estudiante tiene foto,nullsi no | |GET /estudiantes,GET /estudiantes/{id}/resumen| soloVER_ESTUDIANTE_RESUMIDO(TUTOR, DOCENTE) | siemprenull(el endpoin foto les daría 403) | |GET /estudiantes/mi-perfil| el propio estudiante | ruta si tiene foto (puede ver la suya, verobtenerFoto) |
No cambia ningún permiso ni el endpoint GET /estudiantes/{id}/foto.
Compatibilidad
Campo nuevo en la respuesta, sin cambios en los existentes: no rompe a los consumidores actuales.
Tests
- Servicio: visibilidad de
urlFotosegún permiso enlistaryobtenerResumenPorId, yverMiPerfilpara el propio estudiante. Se ajustóobtenerResumenPorId_Exito, que ahora necesita autenticación porque el servicio consulta permisos. - Nuevo
EstudianteMapperTest: con foto, sin foto y ficha completa. - Suite completa: 753 tests, 0 fallas (1 omitido que ya estaba).
Notas
-
EstudianteMapper.toResumenDtoListmapeaurlFotosin filtrar por permiso. Hoy no se usa en ningún lado; si en el futuro se usara, tendría que pasar por el filtro del servicio. - El MR del frontend (
feature/asignacion-grupo-itr-carrera) consume este campo. Conviene mergear este primero; el frontend no se rompe si va antes, pero no muestra fotos hasta que esto esté endev.