Hola Jordi,
aquí tienes el feedback del sprint 9. Cualquier cosa lo miramos.
1. Cambios realizados desde la última revisión
Puntos positivos
- Se han resuelto los TODOs más importantes señalados anteriormente:
- En el calendario (
CalendarViewComponent) ahora se usa un enum (CalendarModalState) para gestionar el estado de los modales, y un signal para el modal activo, haciendo que el flujo de estados sea más claro y totalmente tipado.
- El formulario de vehículo ha extraído los textos y mensajes de error a un servicio dedicado (
VehicleMessagesService), evitando duplicaciones y facilitando el mantenimiento y la posible traducción de mensajes.
- En
GeolocationService se han definido de forma explícita las opciones de geolocalización (timeout, maximumAge) y se ha añadido una cadena de fallback: primero GPS, luego localización por IP y, si todo falla, coordenadas por defecto.
- El calendario se integra mejor con el modelo reactivo de la aplicación: se utiliza un
effect sobre los signals de eventos para refrescar la vista de FullCalendar, manteniendo el estado sincronizado con los servicios.
Puntos a destacar
- Algunos problemas señalados en la revisión anterior (por ejemplo, URLs del API hardcodeadas o el
lang="en" en index.html) siguen presentes, por lo que se mantienen como oportunidades de mejora, pero no se repiten en detalle en este informe para evitar redundancias.
2. Nuevos puntos positivos
2.1. Patrones de código y configuración
-
Configuración estricta de TypeScript y Angular:
- El proyecto está configurado con
strict: true, noImplicitReturns, noFallthroughCasesInSwitch, etc., lo que eleva significativamente la seguridad de tipos y reduce errores sutiles.
- Las opciones del compilador de Angular (
strictTemplates, strictInjectionParameters, typeCheckHostBindings) garantizan revisiones más estrictas a nivel de plantillas y DI.
- Este nivel de exigencia en la configuración no se había destacado en la revisión anterior y es un punto muy fuerte del proyecto.
-
Uso de la nueva API funcional de Angular para Inputs/Outputs:
- En componentes como el formulario de vehículo se utilizan
input() y output() en lugar de los decoradores clásicos (@Input, @Output).
- Esto moderniza el código, reduce boilerplate y encaja perfectamente con la dirección actual de Angular hacia APIs más funcionales.
-
Centralización de mensajes y textos:
AuthService define un objeto authMessages con etiquetas de campos, mensajes de error y notas, lo que hace que el copy de la UI sea mucho más fácil de mantener o traducir en el futuro.
VehicleMessagesService agrupa los textos de formularios, errores y mensajes ARIA, reforzando tanto la consistencia de la interfaz como la accesibilidad.
2.2. Lógica de servicios y estado
3. Nuevas oportunidades de mejora
3.1. Calidad de código y arquitectura
3.2. Rendimiento y comportamiento en producción
Hola Jordi,
aquí tienes el feedback del sprint 9. Cualquier cosa lo miramos.
1. Cambios realizados desde la última revisión
Puntos positivos
CalendarViewComponent) ahora se usa unenum(CalendarModalState) para gestionar el estado de los modales, y unsignalpara el modal activo, haciendo que el flujo de estados sea más claro y totalmente tipado.VehicleMessagesService), evitando duplicaciones y facilitando el mantenimiento y la posible traducción de mensajes.GeolocationServicese han definido de forma explícita las opciones de geolocalización (timeout,maximumAge) y se ha añadido una cadena de fallback: primero GPS, luego localización por IP y, si todo falla, coordenadas por defecto.effectsobre lossignalsde eventos para refrescar la vista de FullCalendar, manteniendo el estado sincronizado con los servicios.Puntos a destacar
lang="en"enindex.html) siguen presentes, por lo que se mantienen como oportunidades de mejora, pero no se repiten en detalle en este informe para evitar redundancias.2. Nuevos puntos positivos
2.1. Patrones de código y configuración
Configuración estricta de TypeScript y Angular:
strict: true,noImplicitReturns,noFallthroughCasesInSwitch, etc., lo que eleva significativamente la seguridad de tipos y reduce errores sutiles.strictTemplates,strictInjectionParameters,typeCheckHostBindings) garantizan revisiones más estrictas a nivel de plantillas y DI.Uso de la nueva API funcional de Angular para Inputs/Outputs:
input()youtput()en lugar de los decoradores clásicos (@Input,@Output).Centralización de mensajes y textos:
AuthServicedefine un objetoauthMessagescon etiquetas de campos, mensajes de error y notas, lo que hace que el copy de la UI sea mucho más fácil de mantener o traducir en el futuro.VehicleMessagesServiceagrupa los textos de formularios, errores y mensajes ARIA, reforzando tanto la consistencia de la interfaz como la accesibilidad.2.2. Lógica de servicios y estado
Gestión avanzada del estado en
VehicleService:signalsy actualizaciones inmutables para gestionar la lista de vehículos (addVehicles,updateVehicle,updateVehicleLocation, etc.).addUserToVehicleyremoveUserFromVehicletienen en cuenta el usuario autenticado (currentUser) para decidir si se debe eliminar todo el vehículo de la lista o solo un usuario concreto, demostrando un modelado de dominio muy cuidadoso.Servicio de geolocalización robusto:
GeolocationServiceencapsula la lógica de obtención de coordenadas con una estrategia escalonada (GPS → IP → coordenadas por defecto).3. Nuevas oportunidades de mejora
3.1. Calidad de código y arquitectura
Diseño de la API de algunos servicios (patrón de suscripción):
loadEvents,addEvent,updateEvent,deleteEvent) se auto-suscriben internamente (subscribe) y no devuelven elObservableal exterior.retryocatchErrorcentralizados, etc.).Observabledesde los servicios y dejar la suscripción en los componentes, efectos o una capa de orquestación, manteniendo los servicios más puros y testeables.Internacionalización (i18n) por explotar:
@ngx-translate) aprovechando que muchos mensajes ya están centralizados.3.2. Rendimiento y comportamiento en producción
Rendimiento potencial del calendario:
eventSourcesreactivos para reducir redibujos completos.Dependencia de un servicio externo de IP en el cliente:
GeolocationServiceconsulta una API pública de localización por IP desde el lado cliente.