mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-02 13:22:11 +03:00
T-15 — Decompose usageDb.js (969→40 lines): - Extract src/lib/usage/migrations.js (legacy + JSON→SQLite migration) - Extract src/lib/usage/usageHistory.js (tracking, pending, log.txt) - Extract src/lib/usage/costCalculator.js (pure cost calculation) - Extract src/lib/usage/usageStats.js (dashboard aggregation) - Extract src/lib/usage/callLogs.js (structured logs, CRUD, rotation) - usageDb.js is now a thin facade re-exporting all functions T-28 — Decompose handleSingleModelChat (183→80 lines): - Extract handleNoCredentials() — credential error responses - Extract safeResolveProxy() — proxy resolution with error handling - Extract safeLogEvents() — fire-and-forget proxy + translation logging - Also created chatHelpers.js with standalone helper exports T-29 — Extract shared UI primitives (3230 total lines): - FilterBar.js — search input + filter chips dropdown - ColumnToggle.js — table column visibility toggle - DataTable.js — generic data table with sticky header, loading/empty Tests: 88/88 pass (no regressions)
7.0 KiB
7.0 KiB
FASE 05 — Qualidade do Código e Padronização
Prioridade: 🟠 Importante / 🟡 Moderado
Estimativa de Complexidade: Média (4–6 dias)
Dimensões do Relatório: D3 (Qualidade do Código), D2 (Organização)
Dependências: FASE-03 (refatoração arquitetural reduz código duplicado antes da padronização)
Objetivo
Padronizar práticas de código em todo o projeto — logging estruturado, definição de estratégia de tipagem, redução de complexidade ciclomática, e decomposição de componentes UI monolíticos.
Escopo Detalhado
5.1 — Structured Logging com Pino
Origem no relatório: D3 — console.log e console.error como Logging em Produção (🟠 Importante)
Especificação Técnica
- Criar
src/shared/utils/logger.jscomo instância centralizada de pino:import pino from "pino"; export const log = pino({ level: process.env.LOG_LEVEL || "info", transport: process.env.NODE_ENV === "development" ? { target: "pino-pretty" } : undefined, }); - Substituir todos os
console.log,console.error,console.warnporlog.info/error/warn. - Priorizar arquivos críticos:
src/server-init.jssrc/proxy.jssrc/sse/handlers/chat.jssrc/lib/usageDb.js(ou módulos decompostos)src/lib/oauth/providers.js
- Incluir contexto estruturado (provider, model, connectionId) nos logs.
Critérios de Aceite
- Zero
console.log/error/warnemsrc/(exceto dev scripts). - Logger centralizado exporta instância de pino.
- Logs em produção são JSON (sem pino-pretty).
- ESLint rule
no-consoleativa com autofix.
5.2 — Definição de Estratégia de Tipagem (JS + JSDoc)
Origem no relatório: D3 — Mix de JS e TS sem Consistência (🟠 Importante)
Especificação Técnica
- Decisão arquitetural: Adotar JavaScript + JSDoc como padrão (não migrar full TS):
- Manter arquivos
.tsexistentes emsrc/types/. - Adicionar
@ts-checknos arquivos JS principais. - Usar
@typedef,@param,@returnspara tipagem inline.
- Manter arquivos
- Configurar tsconfig para checkJs:
{ "compilerOptions": { "checkJs": true, "allowJs": true, "strict": false } } - Priorizar tipagem em:
src/shared/validation/schemas.js— já tipado via Zod.src/lib/db/core.js— funções de DB.src/sse/services/auth.js— credenciais.src/domain/— novos módulos (FASE-03).
- Documentar a decisão em ADR (FASE-06).
Critérios de Aceite
- ≥ 10 arquivos críticos com
@ts-check+ JSDoc. tsc --noEmitexecuta sem erros nos arquivos anotados.- ADR documenta decisão JS + JSDoc vs TypeScript.
- Templates de JSDoc disponíveis em CONTRIBUTING.md.
5.3 — Redução de Complexidade Ciclomática
Origem no relatório: D3 — Complexidade Ciclomática Elevada (🟡 Moderado)
Arquivos afetados
| Arquivo | Função | Linhas | Ação |
|---|---|---|---|
src/sse/handlers/chat.js |
handleSingleModelChat |
183 | Decompor em subfunções |
src/lib/usageDb.js |
getUsageStats |
180 | Extrair SQL queries |
Especificação Técnica
- Decompor
handleSingleModelChatem:resolveModel(body)— resolução de modelo/combo.executeProviderRequest(credentials, translatedBody)— fetch + stream.handleProviderError(error, retryContext)— retry/fallback logic.
- Decompor
getUsageStatsem:buildStatsQuery(period, filters)— construção de SQL.aggregateResults(rows)— computação de estatísticas.
- Target: Nenhuma função com mais de 80 linhas.
Critérios de Aceite
handleSingleModelChattem < 80 linhas.getUsageStatstem < 80 linhas.- Testes existentes passam sem alteração.
- ESLint rule
max-lines-per-functionconfigurada (warn em > 100).
5.4 — Decomposição de Componentes UI Monolíticos
Origem no relatório: D2 — Componentes Monolíticos (🟡 Moderado)
Componentes Alvo
| Componente Original | Tamanho | Decomposição Proposta |
|---|---|---|
RequestLoggerV2.js (36.3 KB) |
~800 linhas | RequestLoggerTable, RequestLoggerFilters, RequestLoggerDetail, useRequestLogger |
UsageStats.js (27.7 KB) |
~600 linhas | UsageChart, UsageTable, UsageSummary, useUsageStats |
ProxyLogger.js (27.6 KB) |
~600 linhas | ProxyLogList, ProxyLogEntry, ProxyLogFilters, useProxyLogger |
OAuthModal.js (18.3 KB) |
~400 linhas | OAuthProviderList, OAuthConnectionForm, OAuthTokenStatus |
ProxyConfigModal.js (16.1 KB) |
~350 linhas | ProxyConfigForm, ProxyConfigPreview, useProxyConfig |
Especificação Técnica
- Para cada componente:
- Extrair custom hook com lógica de estado e data fetching.
- Separar sub-componentes visuais puros.
- Manter componente original como "orchestrator" que compõe sub-componentes.
- Criar diretórios por feature:
src/shared/components/request-logger/src/shared/components/usage-stats/src/shared/components/proxy-logger/
- Manter imports existentes via re-export no arquivo original.
Critérios de Aceite
- Nenhum componente com mais de 300 linhas.
- Hooks extraídos são testáveis independentemente.
- Importações existentes continuam funcionando.
- UI renderiza identicamente (visual regression test ou screenshot comparation manual).
Pré-Requisitos
- FASE-03 completa (decomposição de módulos backend facilita decomposição de componentes).
- CI pipeline ativo (FASE-02) para validar regressões.
Entregáveis
- Logger centralizado com pino.
- ≥ 10 arquivos com JSDoc +
@ts-check. - Funções críticas decompostas (< 80 linhas).
- 5 componentes UI decompostos em sub-componentes.
Critérios de Conclusão da Fase
- Zero
console.logemsrc/. - Nenhuma função > 100 linhas.
- Nenhum componente > 300 linhas.
- CI verde.
Riscos Identificados
| Risco | Probabilidade | Impacto | Mitigação |
|---|---|---|---|
| Decomposição de componentes cria bugs visuais | Média | Médio | Visual regression test antes/depois |
| JSDoc excessivo reduz produtividade | Baixa | Baixo | Tipar apenas funções exportadas |
| Substituição de console.log perde context em edge cases | Baixa | Baixo | Revisão manual de cada substituição |