11 KiB
Plan de Mejora - RSS2 Application
Análisis Complejo
Se ha realizado un análisis exhaustivo identificando 35 problemas en total, clasificados a partir de bugs.md y revisión de código:
- 6 Errores Críticos (seguridad/estabilidad)
- 10 Inconsistencias (funcionalidad)
- 5 Warnings de Arquitectura (mantenibilidad)
- 14 Problemas Adicionales (UI/funcionalidad/performance)
⚠️ Problemas Adicionales Detectados (Nuevos)
🔴 Críticos (2 nuevos)
A. Sin Validación de Entrada en Endpoints Públicos
- Archivos:
handlers/feed.go,handlers/news.go,handlers/search.go - Descripción: Endpoints aceptan parámetros sin validación estricta (ej.
page,per_pagesin límites duros, SQL injection risk enfmt.Sprintf) - Impacto: Posible DoS via parámetros grandes, inyección SQL si cambian queries
- Acción: Usar validator library (
go-playground/validator/v10), validar y sanitizar todos los inputs
B. Transacciones BD sin Manejo de Errores Adecuado
- Archivos:
handlers/feed.go:559-592(ImportFeeds) - Descripción:
SAVEPOINT/ROLLBACK TO SAVEPOINT/RELEASE SAVEPOINTsin verificar errores en cada paso - Impacto: Transacciones parcialmente aplicadas si falla a mitad
- Acción: Verificar error en cada
Exec, usartx.Rollback()en defer
🟡 Alta Priority (3 nuevos)
C. N+1 Query Problem en Entity Loading
- Archivos:
handlers/news.go:314-335(GetNewsByID) - Descripción: Query separada para entities por cada noticia
- Impacto: Latencia alta al cargar detalle de noticia
- Acción: JOIN en query principal o batch loading
D. Pool de Conexiones Sin Configuración Óptima
- Archivos:
backend/internal/db/postgres.go - Descripción: Pool creado con defaults, sin
MaxConns,MinConns,MaxConnLifetime - Impacto: Agotamiento de conexiones bajo carga, conexiones zombie
- Acción: Configurar pool size según cores/load, agregar health checks periódicos
E. Falta de Índices BD en Tablas Críticas
- Archivos:
init-db/+cmd/server/main.go(initDB) - Descripción: Tablas
noticias,traducciones,tags_noticiasin índices en FKs y columnas de filtro - Impacto: Queries lentas en producción con datos reales
- Acción: Añadir índices en
noticias.fecha,noticias.fuente_nombre,traducciones.noticia_id+lang_to,tags_noticia.noticia_id+tag_id
F. Workers Python Sin Graceful Shutdown
- Ubicación:
workers/*.py - Descripción: Workers no manejan SIGTERM/SIGINT, terminan abruptamente
- Impacto: Tareas a medio procesar, estados inconsistentes
- Acción: Implementar signal handling, graceful shutdown con timeout
🟢 Media Priority (2 nuevos)
G. Cache Inconsistente / Sin Cache Strategy
- Ubicación:
backend/internal/cache/redis.go+ handlers - Descripción: Redis disponible pero uso esporádico, sin TTL estándar, sin invalidación
- Impacto: Queries repetidas costosas, datos stale
- Acción: Definir cache keys + TTL estándar, invalidar en writes, usar en feeds/categorías/paises
H. Logging Estructurado Ausente
- Ubicación: Todo el backend
- Descripción: Solo
fmt.Println/log.Printf, sin niveles, sin JSON, sin correlation IDs - Impacto: Debugging difícil en producción
- Acción: Migrar a
zerologozapcon JSON output, request IDs
🔵 Baja Priority (2 nuevos)
I. Documentación API (OpenAPI/Swagger) Ausente
- Ubicación: Backend handlers
- Impacto: Frontend y consumers no tienen spec autogenerada
- Acción: Añadir anotaciones
swaggo/swagogo-swagger, generar/swaggerendpoint
J. Secrets en Variables Entorno Sin Validación
- Ubicación:
config/config.go+ docker-compose - Descripción: Variables como
DB_PASS,REDIS_PASSWORD,SECRET_KEYsin validar presencia/formato - Impacto: Fallos en runtime confusos si faltan
- Acción: Validar todas las vars requeridas al startup, fallar rápido con mensaje claro
🔴 Crítico Priority (Seguridad y Estabilidad)
1. Rate Limiting No Implementado
- Archivo:
backend/internal/middleware/auth.go:104-108 - Descripción: Función vacía que no limita requests
- Impacto: Vulnerable a ataques DoS y fuerza bruta
- Acción: Implementar usando
golang.org/x/time/rate
2. CORS Demasiado Permisivo
- Archivo:
backend/internal/middleware/auth.go:77-90 - Descripción:
Access-Control-Allow-Origin: * - Impacto: CSRF, exposición de datos a orígenes maliciosos
- Acción: Configurar orígenes permitidos desde variable de entorno
3. Secret Key Por Defecto Hardcodeada
- Archivo:
backend/internal/config/config.go:32 - Descripción:
SecretKey: getEnv("SECRET_KEY", "change-this-secret-key") - Impacto: Compromiso total de autenticación si no se configura
- Acción: Hacer
SECRET_KEYobligatoria, panic si no está set
4. Columna role en Users Sin Mapeo en Modelo
- Archivos:
models/models.go:86-94,cmd/server/main.go:41-48 - Descripción: Columna
roleen BD pero no en struct User - Impacto: Confusión entre
roleyis_admin - Acción: Añadir campo
Rolea modelo User o remover columna BD
5. LoggerMiddleware No Funcional
- Archivo:
middleware/auth.go:93-101 - Descripción:
c.Next()sin logging de errores - Impacto: Errores van sin registrar
- Acción: Implementar logging real de respuestas >= 400
6. Traducción Idioma Hardcodeado 'es'
- Archivo:
handlers/news.go:75,96 - Descripción:
t.lang_to = 'es'en múltiples queries - Impacto: No configurable a otros idiomas
- Acción: Pasar idioma como parámetro o configuración
🟡 Alta Priority (Funcionalidad y Estabilidad)
7. Discovery HTML Feed Finder Vacio
- Archivo:
backend/cmd/discovery/main.go:129-133 - Descripción:
findFeedLinksInHTMLretorna[]string{}, nil - Impacto: No detecta feeds en HTML, solo URLsdirectas
- Acción: Implementar con
goquerypara parsear HTML
8. Mapeo de Campos DB vs Modelo Inconsistente
- Archivo:
search.govsmodels/models.go:7-19 - Descripción: Columnas
titulo/resumen/imagen/fechavsTitle/Summary/ImageURL/PublishedAt - Impacto: Errores de serialización potenciales
- Acción: Estandizar nombres en toda la aplicación
9. No Hay Tests Unitarios
- Ubicación: Todo el backend
- Impacto: Cambios pueden romper funcionalidad sin detección
- Acción: Crear tests para handlers críticos (auth, news, feeds)
10. Inicialización BD Duplicada
- Archivos:
db.Connect()vsworkers.Connect() - Impacto: Piscs de conexión separadas, posible agotamiento
- Acción: Consolidar en una sola conexión/pool
11. Parámetros Query Inconsistentes
- Descripción: Algunos usan
category_idvscategoria_id - Impacto: Confusión en filtros
- Acción: Unificar nomenclatura (preferir
category_iden inglés)
12. API Field Naming Inconsistente
- Archivo:
frontend/src/services/api.ts - Descripción: Interface
Newsusa camelCase, pero respuestas van snake_case - Impacto: Datos no se muestran correctamente
- Acción: Arreglar mapping en api.ts o estandarizar respuestas Go
🟢 Media Priority (Calidad y Mantenimiento)
13. No Hay Health Checks en Workers
- Ubicación: Todos los workers Python/Go
- Impacto: Dificultad para monitorear salud de workers
- Acción: Implementar endpoint
/healthen cada worker
14. Structs Duplicadas Mismo Recurso
- Archivo:
handlers/news.govsmodels/models.go:News - Descripción:
NewsResponsediferente amodels.News - Impacto: Mantenimiento duplicado
- Acción: Unificar o mantener mapping explícito
15. Query Params Inconsistentes (category_id vs categoria_id)
- Descripción: Mix de inglés y español en handlers
- Impacto: Confusión para usuarios de la API
- Acción: Definir estándar y aplicarlo en todos lados
16. Duplicación Config DB
- Descripción: API usa
DATABASE_URL, workers usanDB_HOST/DB_PORTetc. - Impacto: Configuración fragmentada
- Acción: Unificar variables de entorno
🔵 Baja Priority (UX y Refactoring)
17. Frontend API Field Mapping Fixes
- Archivo:
frontend/src/services/api.ts - Impacto: Datos se muestran incorrectamente o undefined
- Acción: Revisar y corregir tipos de interfaz
18. Mejorar Estados de Error en UI
- Ubicación: Todas las páginas frontend
- Impacto: UX pobre cuando fallan requests
- Acción: Mensajes de error claros y acciones de recuperación
19. Skeleton Loaders en lugar de Spinners
- Ubicación: Componente NewsList, News detail, etc.
- Impacto: Perceived performance mejorada
- Acción: Implementar componentes skeleton con Tailwind
20. Diseño Responsivo Mejorado
- Ubicación: Grid de noticias, selectores, formularios
- Impacto: Mejor experiencia móvil/tablet
- Acción: Refinar clases Tailwind, breakpoints
21. Tipografía y Esquema de Color Consistente
- Ubicación: Todo el frontend
- Impacto: Aspecto amateur, inconsistencia visual
- Acción: Definir palette principal, usar consistentemente
22. Micro-interacciones y Transiciones Más Suaves
- Ubicación: Hover effects, focus states, button animations
- Impacto: Experiencia más pulida y profesional
- Acción: Agregar transitions, hover: clases, focus-visible
23. Mejoras de Accesibilidad
- Ubicación: Componentes form, links, imágenes
- Impacto: Cumplimiento WCAG, mejor usabilidad
- Acción: ARIA labels, contrast ratios, focus outlines, tabindex
24. Estados Vacios Mejorados
- Ubicación: Páginas sin resultados, sin noticias, estados iniciales
- Impacto: UX cuando no hay datos que mostrar
- Acción: Mensajes descriptivos, ilustraciones, acciones sugeridas
25. Skeletons de Carga por Componente
- Ubicación: News cards, feeds lists, entity lists
- Impacto: Indicar progreso mejor que spinners puros
- Acción: Implementar skeleton grids con dimensiones reales
Resumen Ejecutivo
| Prioridad | Cantidad | Enfoque |
|---|---|---|
| 🔴 Crítico | 8 | Seguridad, estabilidad, validación |
| 🟡 Alta | 10 | Funcionalidad, bugs, performance |
| 🟢 Media | 8 | Mantenimiento, calidad, observabilidad |
| 🔵 Baja | 8 | UX, refinamientos, documentación |
Total: 35 problemas
Primeros pasos recomendados (Sprint 1 - Seguridad + Estabilidad):
- Rate limiting + CORS + Secret key (seguridad inmediata)
- Validación de entrada en endpoints públicos
- Transacciones BD con manejo de errores correcto
- Índices BD en tablas críticas
Sprint 2 - Funcionalidad + Performance: 5. Arreglar naming conventions (consistencia en todo) 6. Pool de conexiones optimizado + health checks 7. N+1 queries en entity loading 8. Cache strategy + invalidación
Sprint 3 - Calidad + Observabilidad: 9. Logging estructurado (zerolog/zap) 10. Tests unitarios para handlers críticos 11. Graceful shutdown en workers 12. Health checks en todos los workers
Sprint 4 - UX + Documentación: 13. OpenAPI/Swagger docs 14. Skeleton loaders + estados vacíos 15. Accesibilidad + micro-interacciones 16. Traducción idioma configurable