Files
scoreko-dev/docs/refactor-audit.md
T
2026-02-21 02:17:43 +01:00

143 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Refactor / Cleanup / Rework Audit
Este documento lista mejoras propuestas para `scoreko-dev`, priorizadas por impacto y esfuerzo.
## 1) Arquitectura y organización
### Alta prioridad
1. **Definir capas explícitas (`domain`, `application`, `infra`, `ui`)** para separar reglas de negocio (scoreboard, players, commentary) de NodeCG/Pinia/Vue y reducir acoplamiento.
2. **Extraer lógica de negocio fuera de componentes Vue** (sobre todo de `ScoreboardPanel.vue`) a composables/servicios dedicados.
3. **Unificar contratos compartidos en un módulo `src/domain`** para evitar que cada store redeclare defaults/normalizadores manuales.
4. **Introducir un patrón de “casos de uso”** (`swapPlayers`, `resetScores`, `savePlayer`, etc.) para dejar de mezclar orquestación y estado reactivo.
5. **Crear un sistema de módulos por feature** (`features/scoreboard`, `features/players`, `features/commentary`) para facilitar testeo y mantenimiento.
### Media prioridad
6. Consolidar helpers transversales (`filterOptions`, normalizadores, parseo de storage) en utilidades versionadas.
7. Estandarizar convención de nombres (`left/right`, `player/commentator`, `override`) y documentarla.
8. Introducir “barrels” (`index.ts`) por feature para reducir imports relativos largos.
9. Separar claramente código “runtime NodeCG” (extension) de código “browser/dashboard”.
## 2) Stores y sincronización con Replicants
### Alta prioridad
10. **Eliminar duplicación de normalización** en `scoreboard.ts`, `players.ts` y `commentary.ts` usando un validador común (zod/valibot o validadores propios centralizados).
11. **Modelar una política única de snapshots en localStorage**: actualmente algunos stores persisten y otros no; unificar criterio por feature.
12. **Tipar mejor `ReplicantLike<T>`** para contemplar estados de carga, errores y ausencia de datos, no solo `data | undefined`.
13. **Agregar control anti-loop más robusto en `syncStateWithReplicant`** (versionado/cambios por hash) para evitar escrituras redundantes.
14. **Introducir acciones atómicas** para operaciones compuestas (ej. swap + persistencia) y facilitar test unitario.
### Media prioridad
15. Añadir métricas de latencia/frecuencia de `save()` para detectar exceso de persistencia.
16. Exponer `dirty state`/`isSynced` por store para feedback de UI y depuración.
17. Implementar estrategia de migración de snapshots al cambiar schema/version.
18. Crear utilidades de actualización parcial (`patchScoreboard`) en vez de reasignar objetos completos repetidamente.
## 3) Componentes Vue y UI (dashboard)
### Alta prioridad
19. **Partir `ScoreboardPanel.vue` en subcomponentes** (jugador izquierdo/derecho, juego/personajes, score controls, overrides).
20. **Mover filtros y autocompletado a composables** (`usePlayerSearch`, `useCountrySearch`, `useCharacterSearch`).
21. **Reducir watchers y `watchEffect` ad-hoc** sustituyéndolos por derivaciones computadas puras y acciones explícitas.
22. **Crear componentes reutilizables** para pares simétricos izquierda/derecha y eliminar lógica duplicada.
23. **Formalizar estados vacíos/errores/carga** en paneles (players, bracket, commentary) para UX consistente.
### Media prioridad
24. Consolidar strings hardcodeados de juegos en una fuente única + i18n.
25. Definir diseño de formularios con reglas de validación declarativas (Quasar rules reutilizables).
26. Introducir navegación por teclado consistente en selects/inputs críticos para operación en vivo.
27. Añadir micro-feedback visual de acciones críticas (swap/reset/save).
28. Desacoplar assets de personajes de la lógica de presentación para soportar themes/skins.
## 4) Extensión NodeCG e integraciones externas
### Alta prioridad
29. **Refactorizar `src/extension/index.ts` a registro de módulos** con manejo explícito de inicialización y fallos por integración.
30. **Encapsular `startgg` y `challonge` detrás de puertos/adaptadores** para que el dominio no dependa de APIs concretas.
31. **Agregar retry/backoff/timeouts centralizados** para llamadas externas.
32. **Registrar logs estructurados** (nivel, contexto, correlación) en vez de logs dispersos.
33. **Definir feature flags/config para habilitar/deshabilitar integraciones** sin tocar código.
### Media prioridad
34. Crear una capa de cache para respuestas repetidas de torneos.
35. Tipar estrictamente respuestas externas y validar payloads de entrada/salida.
36. Establecer límites de tasa por proveedor para evitar bloqueos.
37. Agregar pruebas de contrato para integraciones.
## 5) Esquemas, tipos y contratos
### Alta prioridad
38. **Alinear defaults de código con schemas JSON** y evitar drift entre `schemas/*` y stores.
39. **Automatizar comprobación en CI** de que `schema-types` está actualizado.
40. **Versionar schemas y definir estrategia de migración** para datos persistidos.
41. **Introducir invariantes de dominio explícitas** (scores >= 0, ids válidos, países válidos, etc.).
### Media prioridad
42. Centralizar tipos derivados repetidos en `src/types` para eliminar alias locales redundantes.
43. Definir `branded types` para IDs sensibles (`PlayerId`, `GameId`).
44. Crear tests de regresión de normalizadores contra casos borde.
## 6) Tooling, calidad y automatización
### Alta prioridad
45. **Agregar pipeline CI completo** (lint, typecheck, build, tests, schema drift check).
46. **Separar `lint` de `typecheck`** con scripts dedicados y fail-fast claro.
47. **Incluir tests unitarios** para stores, normalizadores y utilidades compartidas.
48. **Añadir tests de integración de replicants** simulando cambios bidireccionales dashboard/extension.
49. **Incorporar pruebas E2E críticas** para flujos de operación (swap players, update scores, reset).
### Media prioridad
50. Incorporar coverage mínimo y umbrales por carpeta.
51. Añadir pre-commit hooks (lint-staged + prettier/eslint).
52. Documentar comandos de release y versionado semántico.
53. Introducir changelog automático.
## 7) Rendimiento y robustez
### Alta prioridad
54. **Evitar recomputaciones costosas en cada render** cacheando opciones derivadas grandes (jugadores, países, personajes).
55. **Reducir escrituras frecuentes a localStorage/replicant** con debounce/throttle configurable.
56. **Optimizar payloads de replicants** para enviar solo campos cambiados cuando sea viable.
### Media prioridad
57. Medir tiempos de montaje de paneles y establecer presupuesto de rendimiento.
58. Revisar tamaño de bundle y lazy-load de vistas no críticas.
59. Añadir fallback robusto para assets de personajes faltantes.
## 8) Seguridad operativa y resiliencia
### Alta prioridad
60. **Sanitizar y validar inputs de usuario** antes de persistir/renderizar (nombres, handles, textos libres).
61. **Definir límites de longitud por campo** y truncado seguro para evitar overflows visuales.
62. **Manejar degradación controlada** cuando APIs externas fallen durante directo.
### Media prioridad
63. Auditar dependencia y política de actualizaciones de seguridad.
64. Añadir guía de incidentes operativos (qué hacer si falla startgg/challonge).
## 9) Limpieza y eliminación técnica
### Alta prioridad
65. **Eliminar código muerto y utilidades no usadas** tras dividir componentes/composables.
66. **Reducir duplicados izquierda/derecha** mediante abstracciones reutilizables.
67. **Homogeneizar manejo de errores silenciosos** (`catch {}`) con reporte opcional de diagnóstico.
### Media prioridad
68. Revisar assets/imágenes huérfanas y limpiar peso innecesario del repo.
69. Estandarizar comentarios y retirar comentarios obvios/desactualizados.
70. Reorganizar carpetas de `graphics` para facilitar escalado a nuevas overlays.
## 10) Plan sugerido por fases
- **Fase 1 (rápida, alto impacto):** 10, 19, 29, 38, 45, 47, 54, 55, 60, 65.
- **Fase 2 (estabilización):** 11, 13, 20, 30, 31, 39, 46, 48, 56, 67.
- **Fase 3 (escala y DX):** 1, 4, 5, 24, 33, 40, 49, 50, 58, 70.
## 11) Quick wins (12 días)
1. Añadir scripts `typecheck` y `test` en `package.json` + pipeline CI base.
2. Extraer filtros de `ScoreboardPanel` a composables (`useFilterOptions`, `useCountryFilter`).
3. Unificar normalizadores en `src/shared/normalize`.
4. Añadir tests unitarios de `syncStateWithReplicant` y normalizadores.
5. Convertir strings de juegos a una constante única internacionalizable.
6. Agregar debounce a persistencia de storage/replicant.