Skip to content

Arquitetura do Sistema ​

O CRMed utiliza uma arquitetura orientada a serviços dentro de um monorepo Turborepo, com separação clara de responsabilidades entre API, Workers e Frontend.

Visão Geral dos Serviços ​

Apps e Packages (Monorepo) ​

O projeto é organizado usando Turborepo para gerenciar múltiplos pacotes e aplicações em um único repositório:

apps
api Servidor GraphQL, lógica de negócio, autenticação e RBAC (Porta 3001)
package.json
src/index.ts
web Dashboard interno em React 18 com Tailwind CSS e Radix UI (Porta 5173)
package.json
src/App.tsx
workers Filas BullMQ (WhatsApp), Cron Jobs e Webhooks (Porta 3002)
package.json
src/index.ts
packages
config Configurações compartilhadas (ESLint, Prettier, TSConfig)
database Schema Prisma, Migrations, Cliente
prisma/schema.prisma
types Interfaces TypeScript compartilhadas
ui Design System (Componentes React compartilhados)
turbo.json
pnpm-workspace.yaml
package.json

Ciclo de Vida de uma Requisição (Request Lifecycle) ​

Comunicação Interna (Workers → API) ​

Os Workers precisam realizar operações no banco de dados (como atualizar status de agendamentos) que passam pelos resolvers da API. Para isso, usam uma chave de autenticação interna:

Workers → POST /graphql
  Header: x-internal-key: <INTERNAL_API_KEY>

API Context:
  if (internalKey === validInternalKey) {
    user = { userId: 'system', role: 'ADMIN' }
  }

Isso garante que o fluxo de auditoria e regras de negócio da API sejam sempre respeitados, mesmo para operações automatizadas.

Fluxo de Dados End-to-End ​

Infraestrutura de Filas (BullMQ + Redis) ​

O Redis atua em dois papéis distintos no sistema:

PapelDescrição
Filas BullMQJobs de envio de WhatsApp (reminders 30d/7d/48h, pós-op)
Token BlacklistRevogação imediata de sessões via token_blacklist:{userId}
Rate Limit StorePersistência distribuída dos contadores de Rate Limiting

Decisões Arquiteturais ​

#DecisãoMotivo
1Monorepo com TurborepoCompartilhamento de tipos, schemas e componentes sem duplicação. Build incremental via cache.
2GraphQL (Apollo Server)API flexível e auto-documentada. Permite que o frontend peça exatamente os campos necessários (data minimization — LGPD).
3Prisma ORMMigrações versionadas, type-safety total no acesso ao banco e proteção contra SQL Injection nativa.
4BullMQ sobre RedisFilas persistentes com retry automático, prioridade e dead-letter queue para notificações críticas.
5Soft Delete + Audit LogConformidade com LGPD (rastreabilidade e direito à recuperação de dados).
6Cookies HttpOnlyTokens JWT nunca acessíveis via JavaScript — proteção contra XSS por design.