Skip to content

Backend — Visão Geral

O backend do Galdix CRM é uma API REST construída com NestJS, rodando em Node.js, responsável por toda a lógica de negócio, integração com serviços externos e processamento assíncrono de filas.

Localização

/home/crm/app/backend/
├── src/
│   ├── app.module.ts          # Módulo raiz + registro global de guards/interceptors
│   ├── main.ts                # Bootstrap da aplicação
│   ├── common/                # Camada transversal (guards, interceptors, utils)
│   └── modules/               # Módulos de negócio
│       ├── admin/             # Painel de administração
│       ├── audit/             # Trilha de auditoria
│       ├── config/            # Configurações, usuários, roles, lojas
│       ├── crm/               # Inteligência, segmentos, RFM, pós-venda
│       ├── email-templates/   # Templates de email (MJML)
│       ├── erp/               # Sync com Millennium, clientes, vendas
│       ├── integrations/      # WhatsApp (Meta + Evolution), n8n
│       ├── marketing/         # Campanhas, email tracking, segmentação
│       └── redirect/          # Redirecionamento e rastreamento de cliques

Stack

ComponenteTecnologiaVersão
FrameworkNestJS10.x
RuntimeNode.js20.x (Alpine)
ORMPrisma5.x
BancoPostgreSQL13
Cache/FilasRedis + BullMQ5.x
HTTP externoAxios (HttpModule)1.x
Agendamento@nestjs/schedule (node-cron)
AuthClerk SDK5.x
CriptografiaAES-256-GCM (Node crypto)
UploadMinIO SDK (S3-compatible)
EmailNodemailer

Porta e endereço

  • Porta interna: 3001
  • Health check: GET http://localhost:3001/health
  • Base URL produção: https://apicrm.galdix.com.br

Módulos de negócio

MóduloResponsabilidade
adminHealth checks, métricas de sistema, gestão de filas e containers
auditLog de acesso e ações (acessLog)
config/settingsSMTP, WhatsApp, configurações de campanha, lojas
config/usersUsuários, convites Clerk, roles
config/rolesRBAC — criação e hierarquia de perfis
crm/intelligenceSegmentos dinâmicos, preview de audiência, snapshots diários
crm/post-sale-surveyPesquisa pós-venda (CSAT/NPS)
email-templatesCRUD de templates MJML, upload de thumbnails
erp/customersAPI de clientes, filtros, opt-outs
erp/erp-syncSync de vendas (faturamentos) do Millennium ERP
erp/customer-syncSync de clientes (cadastros) do Millennium ERP
erp/salesRecebimento e processamento de vendas
integrations/whatsappTemplates, mensagens, webhooks Meta, Evolution API
marketing/campaignsCRUD de campanhas, envio WhatsApp e email, agendamento
marketing/email-trackingPixel de abertura, rastreamento de cliques, unsubscribe
redirectResolução de token de redirect, opt-out WhatsApp

Padrões arquiteturais

Multi-tenancy via AsyncLocalStorage

Todo request autenticado popula um contexto de tenant via TenantInterceptor usando AsyncLocalStorage. Todos os serviços downstream acessam tenantContext.getStore() para obter organizationId sem precisar passá-lo explicitamente.

Criptografia em repouso

Senhas SMTP, tokens de acesso WhatsApp e outras credenciais são armazenadas cifradas com AES-256-GCM (via EncryptionService). A chave mestre vem de MASTER_ENCRYPTION_KEY no ambiente.

Filas BullMQ

Operações de longa duração (envio de campanhas, sync do ERP) são processadas por workers BullMQ em Redis. Ver Filas BullMQ para topologia completa.

Idempotência

Operações críticas usam jobId fixo no BullMQ para prevenir duplicatas, e a tabela SyncEvent serve como registro de idempotência para webhooks.

Diagrama de camadas

Cliente HTTP


[Express + Helmet + CORS + rawBody]


[Middleware: CorrelationId → HttpLogger]


[Guards: Throttler → ClerkAuth → Roles → Permissions → ReadOnly]


[Interceptors: TenantInterceptor → AuditInterceptor]


[Controller] → [Service] → [Repository/Prisma] → [PostgreSQL]

                    ├─→ [BullMQ Queue] → [Processor Worker]
                    ├─→ [MetaGraphService] → [Meta API]
                    ├─→ [ChatwootApiService] → [Chatwoot]
                    ├─→ [EvolutionApiService] → [Evolution]
                    └─→ [MailService] → [SMTP]

Documentação interna — Galdix CRM