🎯 Clinicafy — Auditoria cs-*

⚙️ cs-senior-engineer — Senior Engineer Code Review

Auditoria técnica e estratégica pela ótica cs-senior-engineer — Senior Engineer Code Review. Achados classificados por severidade, plano de ação e matriz de decisão.

!

Veredito: Código React de alta qualidade com lazy loading e design system consistente, mas API Express sem separação de camadas e CI/CD inexistente.

O frontend usa lazy loading em todas as 26 páginas (App.tsx:40-64), design system via shadcn/ui e motion/react — práticas corretas de SR. O backend é um único arquivo de 2911 linhas sem separação de responsabilidades. Não há CI/CD pipeline configurado (sem .github/workflows/). O uso de 'npm run check' (tsc + vitest + build) é bom, mas não está automatizado em PR.

26
Páginas lazy-loaded
2911L
server.ts sem modularização
0
Workflows CI/CD
vitest
Test framework presente
shadcn/ui
Design system

Dimensões Analisadas

Pontuação por área de análise.

Frontend Architecture

75

Lazy loading correto, design system shadcn/ui, motion/react para animações. App.tsx com 606 linhas ainda gerenciável.

1 achados

Backend Architecture

30

server.ts monolítico, sem Router por domínio, sem camada de serviço, sem repositório.

2 achados

CI/CD Pipeline

10

Sem .github/workflows. Deploy manual. Sem lint on PR, sem test on PR.

1 achados 1 bloqueante(s)

Test Coverage

50

vitest configurado, mas não há evidência de testes de integração rodando vs. DB real.

1 achados

🔎 Achados (5)

0 crítico(s) · 2 alto(s) · 1 bloqueante(s). Clique para expandir.

Sem GitHub Actions — zero automação de CI/CDAltaBloqueanteEsforço medioDevOps / GitHub Actions

O que é: Não existe diretório .github/workflows/ no repo. package.json:25 define 'check': 'npm run lint && npm run test:coverage && npm run build' mas esse script nunca é executado automaticamente em PRs ou pushes.

Onde: package.json:25 + ausência de .github/workflows/

Impacto: Regressões chegam em produção sem barreira. Qualquer push em main vai direto para Vercel sem validação.

✅ Correção: Criar .github/workflows/ci.yml com: checkout → npm ci → npm run check. Bloquear merge se falhar.
server.ts sem Express Router — todas as rotas no escopo globalAltaEsforço altoExpress.js Best Practices

O que é: server.ts mistura em um único arquivo: middleware global (cors, helmet), autenticação, lógica de negócio (MercadoPago, dunning, Meta CAPI) e todas as rotas. Sem uso de express.Router() para separar domínios.

Onde: server.ts:1-2911 (estrutura linear)

Impacto: Qualquer mudança em uma rota pode afetar outra por efeito colateral. Impossível testar rotas isoladas. Onboarding lento.

✅ Correção: Criar src/api/routes/{pacientes,agenda,billing,storage,team}.ts cada um com express.Router(). Server.ts passa a ter apenas app.use('/api', router).
App.tsx com 606 linhas — sidebar e lógica de auth misturadasMédiaEsforço medioSingle Responsibility Principle

O que é: App.tsx:72-606 define SidebarItem, lógica de auth (useAuth hook), proteção de rotas e toda a estrutura de navegação em um único componente. Difícil testar isoladamente.

Onde: src/App.tsx:72-606

Impacto: Rerender do App inteiro a cada mudança de rota. Dificulta code splitting de sidebar vs. conteúdo.

✅ Correção: Extrair: components/Sidebar.tsx, components/AuthGuard.tsx, layouts/AppLayout.tsx. App.tsx fica apenas com Routes.
Erros TypeScript pré-existentes não resolvidosMédiaEsforço medioType Safety

O que é: HANDOFF.md:65-66 documenta erros de tsc em api/_lib/auth.ts e patient-delete.ts:11 que não foram corrigidos. O script 'lint': 'tsc --noEmit' passaria com falha nesses arquivos.

Onde: HANDOFF.md:65-66

Impacto: Erros de tipo acumulam. Possíveis runtime errors mascarados.

✅ Correção: Corrigir os erros pré-existentes. Se não for possível agora, adicionar // @ts-expect-error com justificativa e criar issue de tracking.
Lazy loading correto mas sem Suspense boundaries granularesBaixaEsforço baixoReact Performance

O que é: App.tsx:40-64 usa React.lazy para todas as 26 páginas — correto. Mas não há evidência de ErrorBoundary envolvendo os Suspense, então um erro de carregamento de chunk vai quebrar a tela inteira.

Onde: src/App.tsx:40-64

Impacto: UX degradada em falha de carregamento de chunk (rede ruim, CDN offline).

✅ Correção: Adicionar ErrorBoundary com fallback de retry em volta de cada <Suspense> ou ao menos no nível de rota.

📋 Plano de Ação

Cronograma de implementação recomendado.

1

CI/CD mínimo (2h)

GitHub Actions: ci.yml com npm ci + tsc --noEmit + vitest run + build
devops
2h · CRÍTICO
2

Corrigir erros TSC (4h)

Resolver api/_lib/auth.ts e patient-delete.ts:11
qualidade
4h
3

Extrair Router por domínio (sprint)

5 routers: pacientes, agenda, billing, storage, team
refactor
2 semanas
4

ErrorBoundary nas rotas

Envolver Suspense com ErrorBoundary e fallback de retry
ux
4h

Matriz de Decisão

CritérioFonteStatusBloqueante
CI/CD Automationcs-senior-engineerZero pipelinesSIM
Backend Modularitycs-senior-engineerMonólito 2911Lnão
Frontend Architecturecs-senior-engineerLazy + design systemnão
Type Safetycs-senior-engineerErros TSC pendentesnão
Error Handlingcs-senior-engineerSem ErrorBoundarynão