4.3 KiB
4.3 KiB
Etapa 4/8 — Integrações: Evolution API (WhatsApp) e E-mail
Contexto do projeto
Continuação do SeConectai Vendas. Já existem: setup do projeto, auth completa com RLS, e o CRUD de tenants/planos/faturas no painel master.
Esta etapa conecta a infraestrutura de mensageria: cadastro da Evolution API (nível master), criação de instâncias de WhatsApp por tenant, e configuração de SMTP (padrão da plataforma e por tenant). O disparo automático de alertas fica para a Etapa 7 — aqui o objetivo é deixar a infraestrutura de envio pronta e testável manualmente.
Tarefas
-
Módulo
evolution— nível master (src/modules/evolution/)- CRUD de
evolution_api_config(POST/GET/PUT/DELETE /master/evolution-config), protegido porMasterGuard. - Nunca retornar
api_key_criptoem texto puro nas respostas da API — mascarar (ex: mostrar só os últimos 4 caracteres). - Implementar criptografia AES-256-GCM para
api_key_cripto(chave vinda de variável de ambienteENCRYPTION_KEY, nunca hardcoded). Criar umEncryptionServicereutilizável (vai servir também parasmtp_senha_cripto). POST /master/evolution-config/:id/testar-conexao— faz uma chamada simples à Evolution API (ex: endpoint de status/versão) para validar que abase_url/api_keycadastradas funcionam.
- CRUD de
-
Módulo
whatsapp— nível tenantPOST /tenant/whatsapp/instancias(TenantGuard, roletenant_admin) — cria uma instância na Evolution API (nome único sugerido automaticamente, ex:tenant-<slug>-<uuid curto>), grava emtenant_whatsapp_instancescom statusdesconectado.GET /tenant/whatsapp/instancias/:id/qrcode— solicita o QR code de conexão à Evolution API e retorna para o front exibir; atualizaqr_code_gerado_em.GET /tenant/whatsapp/instancias/:id/status— consulta status atual na Evolution API e sincroniza com o campostatuslocal (desconectado/conectando/conectado/erro).DELETE /tenant/whatsapp/instancias/:id— desconecta e remove a instância na Evolution API e localmente.POST /tenant/whatsapp/instancias/:id/testar-envio— envia uma mensagem de teste para um número informado, útil para o tenant validar a conexão antes de confiar no sistema.- Respeitar
limite_instancias_whatsappdo plano do tenant ao criar nova instância (retornar erro claro se o limite foi atingido).
-
Módulo
email-configmaster_email_config: CRUD simples (MasterGuard) — geralmente só um registro ativo, mas manter como tabela para permitir trocar provedor sem downtime.tenant_email_config:GET/PUT /tenant/email-config(TenantGuard, roletenant_admin) — seusar_config_padrao=true, ocultar/ignorar os campos de SMTP próprio; sefalse, exigir os campos de SMTP preenchidos.POST /tenant/email-config/testar-envio— envia e-mail de teste para um endereço informado, usando a config resolvida (própria ou padrão).- Implementar
EmailServicecentral que resolve automaticamente qual SMTP usar (do tenant ou o padrão) e usanodemailer.
-
Serviço central de envio (preparando a Etapa 7)
- Criar
AlertDispatchServicecom dois métodos:enviarWhatsapp(tenantId, numero, mensagem)eenviarEmail(tenantId, destinatario, assunto, corpo). Ambos apenas executam o envio (sem lógica de "quando enviar" — isso é da Etapa 7) e retornam sucesso/erro. Usar esse service nos endpoints de "testar envio" acima, para já validar que funciona ponta a ponta.
- Criar
Critérios de aceite
- Master consegue cadastrar config da Evolution API e testar conexão
api_keye senha SMTP nunca aparecem em texto puro em nenhuma resposta de API (conferir payloads)- Tenant consegue criar instância WhatsApp, obter QR code, escanear e
ver status mudar para
conectado - Criar instância além do limite do plano retorna erro claro
- Teste de envio de WhatsApp funciona (mensagem chega no número de teste)
- Tenant consegue configurar SMTP próprio ou usar o padrão da plataforma
- Teste de envio de e-mail funciona nos dois modos (SMTP próprio e padrão)
EncryptionServiceusado de forma consistente para todos os segredos armazenados