Files
scoreko-dev/docs/refactor-audit-es.md
T

8.0 KiB

Auditoría técnica integral (repositorio completo)

Objetivo: proponer una lista detallada de refactors, limpiezas, reworks y mejoras para todo el repositorio, con enfoque incremental y sin romper comportamiento.

Alcance revisado (full repo)

  • Extension (backend NodeCG): src/extension/*
  • Dashboard (UI panel): src/dashboard/*
  • Graphics (overlays): src/graphics/*
  • Shared (catálogos y utilidades): src/shared/* y src/browser_shared/*
  • Schemas y tipos generados: schemas/*, src/types/*, configschema.json
  • Tooling y build: package.json, vite.config.ts, tsconfig*.json, eslint*.js
  • Docs y metadatos: README.md, LICENSE, .vscode/*

1) Refactorización de arquitectura (backend + frontend)

  1. Separar módulos grandes de integración (startgg.ts, challonge.ts) en capas:
    • oauth/ (sesiones, callback server, token exchange),
    • api/ (requests, retries, parsing),
    • mappers/ (normalización a modelo interno),
    • listeners/ (registro nodecg.listenFor).
  2. Crear una capa de dominio compartida (src/domain/):
    • Tipos como Tournament, ImportedPlayer, OAuthSession, IntegrationError.
    • Evita duplicidad de interfaces entre extension/dashboard.
  3. Aislar la lógica de sincronización de stores:
    • Mantener store-sync.ts como base, pero separar responsabilidades:
      • snapshot local,
      • sincronización replicant,
      • normalización.

2) Limpieza y unificación de integraciones externas

  1. Eliminar duplicación StartGG/Challonge:
    • Actualmente hay utilidades repetidas (getStringProp, sendAck, OAuth session lifecycle, callback HTML).
    • Crear utilidades comunes en src/extension/util/integrations.ts.
  2. Estandarizar respuestas de listeners:
    • Contrato único: { ok: boolean, data?: T, error?: string, code?: string }.
    • Mejora manejo de errores en dashboard.
  3. Timeout + retry con backoff para fetch:
    • Abortar peticiones lentas, reintentar 429 y 5xx.
  4. Logging estructurado:
    • Añadir requestId, integration, operation, durationMs, status.

3) Endurecimiento de seguridad

  1. Escapar contenido HTML en callbacks OAuth (renderCallbackHtml).
  2. Minimizar exposición de secretos:
    • Nunca serializar client secrets en logs/acks.
  3. Validación defensiva de payloads de listeners:
    • Evitar aceptar estructuras parciales no esperadas.
  4. Cleanup de sesiones OAuth más robusto:
    • Barrido periódico + límite de sesiones en memoria.

4) Tipado y calidad TypeScript

  1. Sustituir casts amplios (as unknown as Record<string, unknown>) por parsers tipados.
  2. Centralizar normalizadores (normalizeX) por dominio en shared/normalizers/.
  3. Discriminated unions para eventos:
    • Listeners de extension y acciones de dashboard más seguros.
  4. Endurecer tsconfig progresivamente:
    • revisar noUncheckedIndexedAccess, exactOptionalPropertyTypes y flags estrictos adicionales.

5) Dashboard: UX, estructura y deuda técnica

  1. Descomponer ScoreboardPanel.vue en subcomponentes:
    • Selectores de jugador,
    • Selectores de personaje,
    • Bloque de score/round/game,
    • Acciones rápidas.
  2. Extraer lógica repetida de filtros/autocomplete a composables:
    • useFilteredOptions, useCountryFilter, useCharacterFilter.
  3. Unificar persistencia local:
    • commentary no persiste snapshot local y players/scoreboard sí.
    • Definir política única.
  4. Accesibilidad:
    • Labels explícitos, foco visible, atajos de teclado básicos.
  5. I18n completo:
    • Detectar cadenas hardcodeadas en componentes y moverlas a i18n.ts.

6) Graphics: mantenibilidad y consistencia visual

  1. Crear una base compartida de render para scoreboard, scoreboard-2xko, commentary:
    • formato de nombre/equipo,
    • fallback de banderas,
    • truncado/ellipsis,
    • placeholders de assets.
  2. Normalizar fuentes y assets:
    • directorio por overlay + convención de naming.
  3. Modo degradado (“safe render”):
    • Cuando faltan datos del replicant, render estable sin romper layout.
  4. Pruebas visuales smoke:
    • snapshots por estado base (vacío / datos completos / datos parciales).

7) Shared data: países, personajes e imágenes

  1. Separar catálogo de personajes de lógica de presentación:
    • JSON/TS puro para data,
    • utilidades aparte para slug, placeholder, imagen.
  2. Detectar drift catálogo vs assets:
    • script que valide personaje declarado pero imagen inexistente (y viceversa).
  3. Optimización de imágenes:
    • convertir PNG grandes a WebP/AVIF (mantener fallback si hace falta).
  4. Consolidar reglas de slugificado para evitar inconsistencias por juego.

8) Schemas, replicants y migraciones

  1. Versionar schemas de replicants:
    • incluir schemaVersion y migraciones compatibles.
  2. Contrato de migración al iniciar extension:
    • migrar datos viejos antes de exponerlos al dashboard/graphics.
  3. Validación runtime adicional tras importaciones externas.
  4. Automatizar verificación de tipos generados (schema-types) en CI.

9) Testing (deuda principal del repo)

  1. Unit tests extension:
    • parsers de payload,
    • normalizadores de torneos/jugadores,
    • utilidades OAuth.
  2. Unit tests shared:
    • países, personaje por juego, slug/imagen fallback.
  3. Tests de stores Pinia:
    • sincronización replicants,
    • swap/reset,
    • persistencia local.
  4. E2E smoke dashboard + graphics:
    • editar datos en panel y verificar overlays.
  5. Contract tests de integraciones con respuestas mockeadas.

10) Build, tooling y CI/CD

  1. Pipeline mínima obligatoria:
    • npm ci
    • npm run lint
    • npm run schema-types
    • npm run build
  2. Script dev estándar (mantener watch como alias).
  3. Checks de tamaño de bundle/assets para detectar regresiones.
  4. Renovación de .vscode settings para alinearse con lint/format del repo.

11) Naming, convenciones y limpieza general

  1. Unificar branding scoreko-dev / Scoreko en UI y docs.
  2. Convención de nombres consistente:
    • archivos Vue en PascalCase, utilidades en kebab-case o camelCase según regla definida.
  3. Depurar archivos de ejemplo:
    • mantener example solo si aporta onboarding real.
  4. Eliminar dead code / imports no usados de módulos grandes en cada iteración.

12) Documentación que crearía o ampliaría

  1. docs/architecture.md (flujo completo NodeCG).
  2. docs/integrations/startgg.md y docs/integrations/challonge.md.
  3. docs/replicants-and-schemas.md (versionado + migraciones).
  4. docs/testing-strategy.md (unit/integration/e2e).
  5. docs/release-checklist.md (build, smoke, rollback).

13) Roadmap por fases (sin romper producción)

  1. Fase 1 (bajo riesgo): tests unitarios shared + extension, utilidades comunes de integración, documentación base.
  2. Fase 2 (riesgo medio): refactor interno de StartGG/Challonge sin cambiar contratos externos.
  3. Fase 3 (riesgo medio): descomposición de paneles dashboard y composables reutilizables.
  4. Fase 4 (riesgo medio/alto): migraciones de schemas + endurecimiento TypeScript.
  5. Fase 5 (continuo): optimización de assets, tests visuales y budget de performance.

Inventario inspeccionado para esta auditoría global

  • Configuración y tooling: package.json, vite.config.ts, tsconfig*.json, eslint*.js, README.md, configschema.json.
  • Extension: src/extension/index.ts, src/extension/startgg.ts, src/extension/challonge.ts, src/extension/util/*, src/extension/example.ts.
  • Dashboard: src/dashboard/scoreko-dev/*, src/dashboard/loading/*, src/dashboard/template.html, src/dashboard/quasar-variables.sass.
  • Graphics: src/graphics/scoreboard/*, src/graphics/scoreboard-2xko/*, src/graphics/commentary/*, src/graphics/template.html.
  • Shared/browser_shared: src/shared/countries.ts, src/shared/fighting-characters.ts, src/shared/character-images/*, src/browser_shared/replicants.ts.
  • Schemas y tipos: schemas/*, src/types/*.