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

8.3 KiB
Raw Blame History

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

  1. Consolidar helpers transversales (filterOptions, normalizadores, parseo de storage) en utilidades versionadas.
  2. Estandarizar convención de nombres (left/right, player/commentator, override) y documentarla.
  3. Introducir “barrels” (index.ts) por feature para reducir imports relativos largos.
  4. Separar claramente código “runtime NodeCG” (extension) de código “browser/dashboard”.

2) Stores y sincronización con Replicants

Alta prioridad

  1. 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).
  2. Modelar una política única de snapshots en localStorage: actualmente algunos stores persisten y otros no; unificar criterio por feature.
  3. Tipar mejor ReplicantLike<T> para contemplar estados de carga, errores y ausencia de datos, no solo data | undefined.
  4. Agregar control anti-loop más robusto en syncStateWithReplicant (versionado/cambios por hash) para evitar escrituras redundantes.
  5. Introducir acciones atómicas para operaciones compuestas (ej. swap + persistencia) y facilitar test unitario.

Media prioridad

  1. Añadir métricas de latencia/frecuencia de save() para detectar exceso de persistencia.
  2. Exponer dirty state/isSynced por store para feedback de UI y depuración.
  3. Implementar estrategia de migración de snapshots al cambiar schema/version.
  4. Crear utilidades de actualización parcial (patchScoreboard) en vez de reasignar objetos completos repetidamente.

3) Componentes Vue y UI (dashboard)

Alta prioridad

  1. Partir ScoreboardPanel.vue en subcomponentes (jugador izquierdo/derecho, juego/personajes, score controls, overrides).
  2. Mover filtros y autocompletado a composables (usePlayerSearch, useCountrySearch, useCharacterSearch).
  3. Reducir watchers y watchEffect ad-hoc sustituyéndolos por derivaciones computadas puras y acciones explícitas.
  4. Crear componentes reutilizables para pares simétricos izquierda/derecha y eliminar lógica duplicada.
  5. Formalizar estados vacíos/errores/carga en paneles (players, bracket, commentary) para UX consistente.

Media prioridad

  1. Consolidar strings hardcodeados de juegos en una fuente única + i18n.
  2. Definir diseño de formularios con reglas de validación declarativas (Quasar rules reutilizables).
  3. Introducir navegación por teclado consistente en selects/inputs críticos para operación en vivo.
  4. Añadir micro-feedback visual de acciones críticas (swap/reset/save).
  5. Desacoplar assets de personajes de la lógica de presentación para soportar themes/skins.

4) Extensión NodeCG e integraciones externas

Alta prioridad

  1. Refactorizar src/extension/index.ts a registro de módulos con manejo explícito de inicialización y fallos por integración.
  2. Encapsular startgg y challonge detrás de puertos/adaptadores para que el dominio no dependa de APIs concretas.
  3. Agregar retry/backoff/timeouts centralizados para llamadas externas.
  4. Registrar logs estructurados (nivel, contexto, correlación) en vez de logs dispersos.
  5. Definir feature flags/config para habilitar/deshabilitar integraciones sin tocar código.

Media prioridad

  1. Crear una capa de cache para respuestas repetidas de torneos.
  2. Tipar estrictamente respuestas externas y validar payloads de entrada/salida.
  3. Establecer límites de tasa por proveedor para evitar bloqueos.
  4. Agregar pruebas de contrato para integraciones.

5) Esquemas, tipos y contratos

Alta prioridad

  1. Alinear defaults de código con schemas JSON y evitar drift entre schemas/* y stores.
  2. Automatizar comprobación en CI de que schema-types está actualizado.
  3. Versionar schemas y definir estrategia de migración para datos persistidos.
  4. Introducir invariantes de dominio explícitas (scores >= 0, ids válidos, países válidos, etc.).

Media prioridad

  1. Centralizar tipos derivados repetidos en src/types para eliminar alias locales redundantes.
  2. Definir branded types para IDs sensibles (PlayerId, GameId).
  3. Crear tests de regresión de normalizadores contra casos borde.

6) Tooling, calidad y automatización

Alta prioridad

  1. Agregar pipeline CI completo (lint, typecheck, build, tests, schema drift check).
  2. Separar lint de typecheck con scripts dedicados y fail-fast claro.
  3. Incluir tests unitarios para stores, normalizadores y utilidades compartidas.
  4. Añadir tests de integración de replicants simulando cambios bidireccionales dashboard/extension.
  5. Incorporar pruebas E2E críticas para flujos de operación (swap players, update scores, reset).

Media prioridad

  1. Incorporar coverage mínimo y umbrales por carpeta.
  2. Añadir pre-commit hooks (lint-staged + prettier/eslint).
  3. Documentar comandos de release y versionado semántico.
  4. Introducir changelog automático.

7) Rendimiento y robustez

Alta prioridad

  1. Evitar recomputaciones costosas en cada render cacheando opciones derivadas grandes (jugadores, países, personajes).
  2. Reducir escrituras frecuentes a localStorage/replicant con debounce/throttle configurable.
  3. Optimizar payloads de replicants para enviar solo campos cambiados cuando sea viable.

Media prioridad

  1. Medir tiempos de montaje de paneles y establecer presupuesto de rendimiento.
  2. Revisar tamaño de bundle y lazy-load de vistas no críticas.
  3. Añadir fallback robusto para assets de personajes faltantes.

8) Seguridad operativa y resiliencia

Alta prioridad

  1. Sanitizar y validar inputs de usuario antes de persistir/renderizar (nombres, handles, textos libres).
  2. Definir límites de longitud por campo y truncado seguro para evitar overflows visuales.
  3. Manejar degradación controlada cuando APIs externas fallen durante directo.

Media prioridad

  1. Auditar dependencia y política de actualizaciones de seguridad.
  2. Añadir guía de incidentes operativos (qué hacer si falla startgg/challonge).

9) Limpieza y eliminación técnica

Alta prioridad

  1. Eliminar código muerto y utilidades no usadas tras dividir componentes/composables.
  2. Reducir duplicados izquierda/derecha mediante abstracciones reutilizables.
  3. Homogeneizar manejo de errores silenciosos (catch {}) con reporte opcional de diagnóstico.

Media prioridad

  1. Revisar assets/imágenes huérfanas y limpiar peso innecesario del repo.
  2. Estandarizar comentarios y retirar comentarios obvios/desactualizados.
  3. 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.