Fix: ajustes de la revisión de contraseña temporal
Seguimiento de la revisión del MR 83 y 84.
Cambios
-
codeen el 403 de contraseña temporal. El body ahora trae"code":"PASSWORD_CHANGE_REQUIRED", para que el frontend lo distinga de un 403 por permisos sin comparar el texto delmessage.ApiErrorAttributeslo copia solo cuando el filtro lo pide. -
Rutas públicas ya no se bloquean. El chequeo de
PENDIENTE_DE_ACTIVACIONcorre con cualquier token válido, así que con el Bearer adjunto,/auth/login,/forgot-passwordy/reset-passwordde ese usuario daban 403. Ahora todo/auth/**yPOST /reportes/validarquedan permitidos. El test que escribí antes del arreglo falló enPOST /auth/login, lo que confirma el bug. -
EmailService. Los placeholders se reemplazan en un solo pase con regex: un valor con{{OTRA_CLAVE}}(ej. un título escrito por un usuario) ya no se pisa según el orden delMap. Además se cachean las plantillas, se agrupan las constantesPLANTILLA_*y se borra un overload sin uso. -
Tuteo unificado en los emails. El texto plano de cuatro emails estaba en voseo y su HTML en tuteo; ahora todos van en tuteo neutro, como las plantillas de diseño. Los mensajes de la API (
No tienes permisos…junto aIntentá…) quedan fuera y se ven aparte. -
uploads/en.gitignore, más un test de queFileStorageServicecrea la carpeta base en el primer upload. -
Mensaje de los errores de filtro declarado, no deducido (revisión del MR de formato de errores). Los
sendErrordel proyecto pasan porApiErrorAttributes.enviarError(...), que declara el mensaje en un atributo del request; solo ese texto llega al cliente. Antes se decidía comparando contra frases en inglés, y el texto de cualquier librería fuera de esa lista se colaba. Se agregaErrorFormatIntegrationTest(servidor HTTP real coninclude-message=never, como producción). - Tuteo unificado en los mensajes de la API (8 mensajes), como los emails.
- El campo
errorsigue con la frase HTTP en inglés a propósito: unificarlo cambia el contrato y hay que coordinarlo con el frontend. Quedó documentado enApiErrorAttributes.
Edited by Agustín Cantero