Consolidação completa do cenário inicial antes das correções — 12 repositórios analisados
anyA plataforma Fastcomm apresentava débito técnico severo e sistêmico. Os 12 repositórios compartilhavam padrões problemáticos recorrentes: Dependency Inversion violado em 11 de 12 repos (maioria crítico), God Objects com até 1.354 linhas, duplicação massiva entre camadas, dead code com dependências de 500MB+ (PySpark), e falhas de segurança como JWT decode sem verificação de assinatura e CORS permissivo. O ecossistema não tinha padrões unificados de tratamento de erros, logging ou abstração de CRUD.
Análise de conformidade com os cinco princípios SOLID e grau de acoplamento entre módulos.
O princípio DIP (Dependency Inversion) era Crítico em 11 dos 12 repositórios —
classes concretas injetadas diretamente, new Service() fora do container IoC, e process.env
acessado sem ConfigService. O SRP apresentava God Objects em 4 projetos.
| Repositório | SRP | OCP | LSP | ISP | DIP | Acoplamento |
|---|---|---|---|---|---|---|
| orquestrator | Alto | Alto | Médio | Alto | Crítico | Médio |
| engine | Crítico | Crítico | Médio | Alto | Crítico | Crítico |
| engine-front | Crítico | Alto | Médio | Alto | Crítico | Alto |
| executor | Alto | Alto | Médio | Alto | Crítico | Crítico |
| core | Crítico | Alto | Médio | Alto | Crítico | Alto |
| opencore | Crítico | Alto | Médio | Médio | Crítico | Crítico |
| front | Crítico | Alto | Médio | Alto | Crítico | Alto |
| apps | Crítico | Alto | Médio | Alto | Crítico | Alto |
| infosec | Crítico | Alto | Médio | Crítico | Crítico | Alto |
| cron | Crítico | Alto | Médio | Alto | Crítico | Alto |
| cronjob | Crítico | Alto | Baixo | Médio | Crítico | Médio |
| log-service | Alto | Médio | Baixo | Médio | Alto | Médio |
DIP: HttpService concreto injetado direto em 3+ services do orquestrator; new FastcommInfosecService() no AuthGuard do opencore;
process.env direto em 10+ locais do core sem ConfigService; Cryptr instanciado com new em vez de DI.
SRP: FastcommCoreService (opencore) com 1.195 linhas e 42 métodos; ConstantsService (core) com 6 responsabilidades;
AppService (orquestrator) como God Class com 5 responsabilidades.
OCP: Cadeias if/else para formatos de dados sem Strategy Pattern; CircuitBreaker com config hard-coded; AuthGuard fechado a novos providers.
Análise de code smells em todos os 12 projetos. Total estimado: 780+ instâncias. Os smells mais recorrentes eram transversais ao ecossistema, indicando ausência de padrões e governança técnica.
| Repositório | Stack | Arquivos | Instâncias | Pior Smell |
|---|---|---|---|---|
| engine | NestJS + Legacy JS | ~120 | 130+ | 85+ any, pasta legacy/ 4k linhas JS |
| front | Vue 3 + JS + Vuex | ~90 | 102+ | 30+ new Promise() desnecessários |
| core | NestJS + Sequelize | ~80 | 95+ | God Object 600+ linhas, 30+ any |
| apps | Express + JS | ~480 | 100+ | God Class 1.354 linhas, 18 console.* |
| engine-front | Vue 3 + JS | ~70 | 88+ | God Components 2.055 linhas, v-html XSS |
| opencore | NestJS + TS | ~60 | 87+ | God Object 1.195 linhas, 32+ any |
| executor | NestJS + BullMQ | ~45 | 80+ | 13 throw Error genérico, 17+ any |
| orquestrator | NestJS + TS | ~71 | 67+ | 40+ any, CORS permissivo |
| cron | NestJS + TS | ~30 | 58+ | 6 operadores ==, fire-and-forget |
| infosec | NestJS + Cognito | ~35 | 48+ | JWT decode sem verify, DI violado |
| cronjob | NestJS + TypeORM | ~25 | 35+ | Fire-and-forget em cron jobs |
| log-service | Python + FastAPI | ~16 | 28+ | Bug connect_args, 232 linhas dead code |
any 200+ instâncias
JWT decode sem verificação de assinatura no AuthGuard de opencore e infosec — decisão de roteamento baseada em token não verificado.
CORS com origin: [] em orquestrator e infosec quando ALLOWED_ORIGINS não configurado.
Tokens de serviço expostos no bundle frontend (front) — visíveis no código transpilado.
Path hardcoded para chave SSH privada em opencore.
Senha padrão via env var (DEFAULT_ADMIN_PASSWORD) em infosec.
v-html sem sanitização adequada em engine-front — risco de XSS.
Estimativa de ~7.500 linhas duplicadas no ecossistema. Os dois piores casos eram o
ai-fastcomm-front com 107+ Vuex actions repetindo o mesmo anti-pattern de new Promise(), e o
ai-fastcomm-opencore com core.service.ts de 1.195 linhas e 45+ catch blocks idênticos.
| Repositório | Risco | Linhas Duplic. | Principal Problema |
|---|---|---|---|
| front | Alto | ~1.500 | 107+ actions duplicadas, 9 list components idênticos |
| apps | Alto | ~1.300 | 8 controllers CRUD com estrutura idêntica |
| opencore | Alto | ~1.000 | core.service.ts 1.195 linhas, 30 métodos CRUD repetidos |
| engine-front | Alto | ~800 | 35+ Vuex actions com Promise wrapper, 84 emits |
| engine | Alto | ~600 | Métodos duplicados entre src/ e legacy/ |
| executor | Médio-Alto | ~500 | replaceDoubleCurlyBraces em 2 versões, 26+ constructors |
| core | Alto | ~500 | Soft-delete repetido 20×, healthcheck duplicado |
| infosec | Médio-Alto | ~400 | 3 health checks coexistindo, CRUD em 3 services |
| orquestrator | Médio-Alto | ~380 | isHealthy() duplicado, 9 try-catch idênticos |
| cron | Médio-Alto | ~200 | 2 middlewares de auth com 60% de overlap |
| cronjob | Médio | ~150 | 5 blocos QueryRunner try-finally idênticos |
| log-service | Médio | ~80 | _to_datetime() e _iso_from_dt() duplicados + bug connect_args |
Identificação de código morto, imports não utilizados, dependências sem uso, console.* em produção e TODO/FIXME pendentes. Dois projetos obtiveram nota máxima (cron e orquestrator). Os piores eram apps (4,0/10) e log-service (6,3/10) — este último com 232 linhas de código Spark morto e dependências de 500MB+.
| Repositório | Score | Problema Principal | Severidade Máx. | |
|---|---|---|---|---|
| cron | Limpo | Nenhum dead code | ✅ | |
| orquestrator | Limpo | Nenhum dead code | ✅ | |
| cronjob | Baixa | pg-query-stream possivelmente indireta | Baixa | |
| executor | Baixa | TODO pendente + helpers com nome similar | Baixa | |
| engine-front | Média | vue-click-outside possivelmente não utilizado | Média | |
| core | Alta | Módulo healthcheck/ duplicado e não registrado | Alta | |
| opencore | Média | Swagger instalado mas não inicializado | Média | |
| infosec | Alta | Módulo healthcheck/ duplicado e não registrado | Alta | |
| engine | Alta | 32 console.* no legacy + log de credencial comentado | Alta | |
| front | Alta | Mutation setGroups vazia — funcionalidade quebrada | Alta | |
| log-service | Alta | 3 módulos Spark mortos + import quebrado + bug connect_args | Alta | |
| apps | Alta | Migration stub + cors morto + 10+ console.log | Alta |
| Classe / Arquivo | Repositório | Linhas | Métodos | Responsabilidades Misturadas |
|---|---|---|---|---|
| ConfigurationTotemService | apps | 1.354 | 50+ | Toda configuração de totens em um único serviço |
| FastcommCoreService | opencore | 1.195 | 42 | 6 domínios: clients, DB, SSH, auth, AI, constants |
| PipelineDetail.vue | engine-front | 2.055 | 40+ | Grafo visual, forms, validação, testes, CRUD |
| Helpers | apps | 513 | 50+ | 11 domínios distintos: I/O, paciente, HTTP, data, etc. |
| BillingService | apps | 477 | — | Consulta, transformação e persistência de faturamento |
Classificação geral baseada nas 4 dimensões analisadas: SOLID, Code Smells, Duplicação e Dead Code. Nota composta considerando severidade e impacto.
| Repositório | SOLID | Smells | Duplicação | Dead Code | Risco Geral |
|---|---|---|---|---|---|
| engine | Crítico | 130+ | ~600 linhas | 8,4 | Crítico |
| opencore | Crítico | 87+ | ~1.000 linhas | 9,3 | Crítico |
| apps | Crítico | 100+ | ~1.300 linhas | 4,0 | Crítico |
| front | Crítico | 102+ | ~1.500 linhas | 8,4 | Crítico |
| core | Crítico | 95+ | ~500 linhas | 9,3 | Crítico |
| engine-front | Crítico | 88+ | ~800 linhas | 9,7 | Alto |
| infosec | Crítico | 48+ | ~400 linhas | 9,2 | Alto |
| executor | Crítico | 80+ | ~500 linhas | 9,7 | Alto |
| cron | Crítico | 58+ | ~200 linhas | 10,0 | Alto |
| log-service | Alto | 28+ | ~80 linhas | 6,3 | Alto |
| cronjob | Crítico | 35+ | ~150 linhas | 9,8 | Médio-Alto |
| orquestrator | Alto | 67+ | ~380 linhas | 10,0 | Médio-Alto |