🎯 Clinicafy — Auditoria cs-*

🏗️ cs-fullstack-engineer — Fullstack Engineering Orchestrator

Auditoria técnica e estratégica pela ótica cs-fullstack-engineer — Fullstack Engineering Orchestrator. Achados classificados por severidade, plano de ação e matriz de decisão.

!

Veredito: Stack React+Express+Prisma correta para o estágio, mas o padrão shim Firestore→MySQL cria dívida de abstração que precisará ser removida antes do escalonamento.

Resposta às 7 perguntas de forcing: Team=1, Cadence=diária, User-facing=sim, Budget=mínimo, Traffic p99=baixo (<100 RPS), Data=PII+saúde, SLO=99.5%. Profile: Solo founder, MVP-to-Series-A. Stack escolhida (React+Vite+Express+Prisma+MySQL) é adequada. Principal problema arquitetural: o alias Vite para mockFirestore cria um anti-pattern que coloca lógica de autenticação no cliente quando deveria estar no servidor, e cria débito de abstração de toda a camada de dados.

React 19 + Vite
Frontend — correto
Express + Prisma
Backend — correto para estágio
mockFirestore shim
Anti-pattern de abstração
MySQL Hostinger
DB — risco de vendor lock
Firebase Auth
Auth — correto (free, escalável)

Dimensões Analisadas

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

API Design

50

REST correto mas sem versionamento (/api/v1). Sem OpenAPI spec. Rotas misturadas no server.ts.

2 achados

Database Design

60

Prisma com schema correto. Prefixos clinic_* para isolamento parcial. Sem migrations automatizadas.

2 achados 1 bloqueante(s)

Frontend Architecture

70

React 19 com lazy, shadcn, motion. Shim Firestore é o único problema arquitetural.

1 achados

Deployment Architecture

40

Vercel serverless + Hostinger MySQL cria latência cold start. Sem cache layer.

2 achados

🔎 Achados (4)

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

Shim mockFirestore cria acoplamento implícito — toda a lógica de dados depende de um alias ViteAltaEsforço altoAPI Design / Dependency Inversion

O que é: vite.config.ts:56 remapeia 'firebase/firestore' → mockFirestore.ts. Isso significa que qualquer componente que importa getDocs/addDoc está na verdade fazendo fetch HTTP para a API. O acoplamento está em um arquivo de configuração de build — invisível para linters e IDEs.

Onde: vite.config.ts:56 + src/lib/mockFirestore.ts

Impacto: Build sem o vite.config.ts correto quebra toda a persistência de dados silenciosamente. Risco alto em migração de build tool.

✅ Correção: Migrar progressivamente para imports explícitos: import { getPatients } from '@/lib/api/patients'. Cada módulo usa a API diretamente. Eliminar o alias em 3 sprints.
Vercel serverless + MySQL sem cache = latência alta em queries frequentesAltaEsforço medioPerformance Architecture / Caching

O que é: Cada request serverless Vercel abre nova conexão MySQL no Hostinger (sem pooling garantido). Queries como GET /api/pacientes (lista completa) são feitas a cada render de PatientsPage sem cache. Cold start da função serverless adiciona 200-500ms extras.

Onde: server.ts + src/lib/prisma.js (connection sem pool) + Vercel serverless

Impacto: Latência de API de 500-1500ms em cold start. UX ruim em primeira navegação. Custo de compute alto.

✅ Correção: 1) Adicionar cache in-memory por request para queries de lista (não dados médicos críticos). 2) Usar Vercel Edge Config para config data. 3) Considerar Vercel KV (free) para cache de dados públicos.
Sem API versioning — breaking changes afetam todos os clientesMédiaEsforço medioAPI Design / Backwards Compatibility

O que é: Todas as rotas da API estão em /api/ sem versionamento (/api/v1/). Qualquer mudança de schema quebrará clientes existentes (web app, potencial app mobile futuro) sem período de migração.

Onde: server.ts (todas as rotas /api/*)

Impacto: Impossível fazer breaking changes na API sem coordenar deploy simultâneo de frontend. Risco em deploys parciais.

✅ Correção: Adicionar prefixo /api/v1/ nas rotas novas. Manter /api/ existente para compatibilidade. Adicionar X-API-Version header nas responses.
Sem OpenAPI/Swagger spec — API sem documentação formalMédiaEsforço medioAPI Documentation

O que é: server.ts tem 2911 linhas de rotas sem especificação OpenAPI. Impossível gerar cliente tipado para app mobile futuro, impossível fazer integration testing automatizado, impossível onboarding de dev de API.

Onde: server.ts (ausência de @swagger ou openapi.yaml)

Impacto: Cada nova integração requer leitura do source. Dificulta crescimento do time.

✅ Correção: Adicionar swagger-jsdoc + swagger-ui-express. Documentar as 20 rotas mais críticas com JSDoc. Gerar spec em /api/docs.

📋 Plano de Ação

Cronograma de implementação recomendado.

1

Prisma connection pooling (2h)

Singleton pattern + connection_limit=5 na DATABASE_URL serverless
performance
2h · CRÍTICO
2

API versionamento /v1 (1 sprint)

Prefixar rotas novas com /api/v1/. Manter /api/ legado.
api
1 sprint
3

Migrar mockFirestore progressivamente (3 sprints)

Um módulo por sprint: pacientes → agenda → consultas. Usar @/lib/api/.
refactor
6 semanas
4

OpenAPI docs (1 semana)

swagger-jsdoc nas 20 rotas críticas. /api/docs endpoint.
docs
1 semana

Matriz de Decisão

CritérioFonteStatusBloqueante
Stack Selectioncs-fullstack-engineerReact+Express+Prisma corretosnão
mockFirestore Abstractioncs-fullstack-engineerAnti-pattern de alias Vitenão
API Versioningcs-fullstack-engineerAusentenão
Caching Strategycs-fullstack-engineerZero cache layernão
DB Connection Poolingcs-fullstack-engineerSem pooling serverlessnão