Módulo WhatsApp

Mensagens WhatsApp

Integração com Evolution API para envio de texto via REST autenticado.

Visão geral

O módulo whatsapp envia mensagens de texto pela Evolution API (/message/sendText/{instance}). É um wrapper fino: um endpoint REST e um service com fetch.

Pontos principais

  • • Config via EVOLUTION_API_URL / INSTANCE / KEY
  • • POST /whatsapp/send com JWT
  • • Número enviado como informado
  • • Falhas de rede/API propagam como HTTP 502
  • • WhatsappService exportado

Estrutura

Filesystemsrc/modules/whatsapp
src/modules/whatsapp/
├── whatsapp.module.ts
├── whatsapp.controller.ts
├── whatsapp.service.ts
└── dtos/
    └── send-whatsapp.dto.ts

src/config/whatsapp.config.ts

Configuração Evolution API

Namespace whatsapp em src/config/whatsapp.config.ts:

Environment.env
EVOLUTION_API_URL=http://localhost:8080
EVOLUTION_API_INSTANCE=default
EVOLUTION_API_KEY=your-api-key

Instância

A instance deve existir na Evolution API. A key vai no header apiKey da requisição. Sem URL/instance configurados, a API responde 503.

WhatsappService

Método principal:

  • • sendMessage(to, message) — POST ${url}/message/sendText/${instance}
  • • Body: { number: to, text: message }
  • • Headers: Content-Type application/json, apiKey

Comportamento de erro

Rede ou HTTP não-OK da Evolution → BadGatewayException (502). Config ausente → ServiceUnavailableException (503). O controller não responde 200 nesses casos.

TypeScriptsendMessage
// WhatsappService.sendMessage(to, message)
// número enviado como informado

POST ${EVOLUTION_API_URL}/message/sendText/${EVOLUTION_API_INSTANCE}
Headers: { "Content-Type": "application/json", "apiKey": "..." }
Body: { "number": to, "text": message }

API REST

JWT obrigatório. Sem @Roles — qualquer usuário autenticado.

DTO

  • • to — string só com dígitos (@Matches /^\d+$/); enviada como está
  • • message — string não vazia

Enviar mensagem

to: só dígitos, no formato esperado pela Evolution (inclua o DDI se necessário, ex. 5511999999999). message: texto.

HTTP RequestPOST
POST /api/v1/whatsapp/send
Content-Type: application/json
Authorization: Bearer <access_token>

{
  "to": "5511999999999",
  "message": "Hello, this is a test message"
}

Resposta de sucesso

HTTP Response200
{
  "message": "WhatsApp message sent successfully"
}

Respostas de erro

  • • 401 — JWT ausente ou inválido
  • • 502 — Evolution inacessível ou respondeu com erro
  • • 503 — EVOLUTION_API_URL / INSTANCE não configurados

Usar em outro módulo

Importe WhatsappModule e injete WhatsappService.

TypeScriptFeature module
@Module({
  imports: [WhatsappModule],
  providers: [MyService],
})
export class MyModule {}

@Injectable()
export class MyService {
  constructor(private readonly whatsappService: WhatsappService) {}

  async notify(phone: string, text: string) {
    await this.whatsappService.sendMessage(phone, text);
  }
}

Atenção

Formato do número

O service não adiciona DDI. Envie to já no formato que a Evolution API espera (ex.: 5511999999999 para Brasil).

Erros da API

Falhas de rede/HTTP da Evolution sobem como 502. Sucesso só após response.ok.

Explorar