269 lines
No EOL
11 KiB
Markdown
269 lines
No EOL
11 KiB
Markdown
# 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 |