# 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_page` sin límites duros, SQL injection risk en `fmt.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 SAVEPOINT` sin verificar errores en cada paso - **Impacto:** Transacciones parcialmente aplicadas si falla a mitad - **Acción:** Verificar error en cada `Exec`, usar `tx.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_noticia` sin í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 `zerolog` o `zap` con 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/swag` o `go-swagger`, generar `/swagger` endpoint #### J. Secrets en Variables Entorno Sin Validación - **Ubicación:** `config/config.go` + docker-compose - **Descripción:** Variables como `DB_PASS`, `REDIS_PASSWORD`, `SECRET_KEY` sin 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_KEY` obligatoria, 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 `role` en BD pero no en struct User - **Impacto:** Confusión entre `role` y `is_admin` - **Acción:** Añadir campo `Role` a 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:** `findFeedLinksInHTML` retorna `[]string{}, nil` - **Impacto:** No detecta feeds en HTML, solo URLsdirectas - **Acción:** Implementar con `goquery` para parsear HTML ### 8. Mapeo de Campos DB vs Modelo Inconsistente - **Archivo:** `search.go` vs `models/models.go:7-19` - **Descripción:** Columnas `titulo`/`resumen`/`imagen`/`fecha` vs `Title`/`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()` vs `workers.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_id` vs `categoria_id` - **Impacto:** Confusión en filtros - **Acción:** Unificar nomenclatura (preferir `category_id` en inglés) ### 12. API Field Naming Inconsistente - **Archivo:** `frontend/src/services/api.ts` - **Descripción:** Interface `News` usa 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 `/health` en cada worker ### 14. Structs Duplicadas Mismo Recurso - **Archivo:** `handlers/news.go` vs `models/models.go:News` - **Descripción:** `NewsResponse` diferente a `models.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 usan `DB_HOST`/`DB_PORT` etc. - **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):** 1. Rate limiting + CORS + Secret key (seguridad inmediata) 2. Validación de entrada en endpoints públicos 3. Transacciones BD con manejo de errores correcto 4. Í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