Receba novidades do Hedhog no seu e-mail
Novos lançamentos, receitas e breaking changes — sem spam.
Submódulo Campaign
campaigns
CRUD principal de campanhas mais ações de ciclo de vida: agendar, iniciar, pausar, retomar, cancelar e duplicar.
Caminho de origem: libraries/campaign/src/services/campaign.service.ts, campaign-dispatch.service.ts, campaign-dashboard.service.ts, campaign-event.service.ts
Arquivo do módulo: campaign.module.ts
Introdução
O submódulo Campaigns é dono do próprio registro `campaign`: seu conteúdo (assunto, corpo em HTML/texto simples, referência opcional a um template), sua lista de destinatários, seu perfil de entrega e sua máquina de estados de ciclo de vida. Uma campanha é criada com status `draft` e avança por `scheduled` → `sending` → `completed` (ou `paused`, `canceled`, `failed`) à medida que o CampaignDispatchService a conduz adiante. Apenas campanhas com status `draft`, `canceled` ou `failed` podem ser excluídas, o que protege os dados históricos de entrega de tudo o que realmente já foi enviado.
Iniciar uma campanha (`POST /campaign/:id/start`, com alias em `/send`) é a operação mais complexa do módulo. O CampaignDispatchService primeiro valida que a campanha possui um perfil de entrega de e-mail (um Integration Profile), uma lista de destinatários e conteúdo não vazio e — quando a configuração `campaign.unsubscribe.required` está habilitada — que o conteúdo inclui o placeholder `{{unsubscribeUrl}}`. Em seguida, ele carrega a lista de destinatários, deduplica por e-mail normalizado e faz o cruzamento com a lista global de supressão antes mesmo de tocar o banco de dados em uma transação de escrita. Dentro de uma única transação, ele faz upsert de uma linha `campaign_message` por destinatário elegível (pulando os suprimidos/descadastrados/com bounce como `skipped` e reaproveitando linhas que já existem para evitar duplicar envios em andamento na retomada), depois atualiza os contadores da campanha e muda o status para `sending`. Somente após o commit da transação é que ele enfileira um job de fila por mensagem pendente via `CampaignEmailWorkerService` — ou, se `campaign.queue.enabled` estiver desligado, envia cada mensagem de forma inline e síncrona dentro da mesma requisição, reportando o progresso por destinatário através de um registro de Notification.
Pausar e retomar afetam apenas o status da campanha; as mensagens subjacentes e seus jobs de fila são deixados intactos, de modo que uma campanha retomada continua de onde a fila em andamento parou, em vez de reenfileirar mensagens já enviadas. Cancelar define `status: canceled`, que o worker lê no momento do envio para pular as mensagens restantes sem excluí-las. Duplicar cria um novo rascunho a partir do conteúdo e da configuração de uma campanha existente, redefinindo explicitamente cada contador de entrega, timestamp e o agendamento, para que a cópia comece limpa.
O dashboard global (`GET /campaign/dashboard`) e o dashboard por campanha (`GET /campaign/:id/dashboard`) são endpoints de agregação somente leitura respaldados pelo CampaignDashboardService: contagens de status em todas as campanhas, mensagens enviadas hoje, backlog pendente/enfileirado, contagens de falhas nas últimas 24h, totais de supressão/descadastramento e um histórico de envios agrupado por dia dos últimos 7/30 dias, além do contexto de rate-limit (cota diária e capacidade restante) fornecido pelo CampaignRateLimitService. O `GET /campaign/:id/status` é uma combinação mais leve do registro bruto da campanha com contagens agregadas de status de mensagens, útil para polling sem carregar o payload completo do dashboard. Cada transição de estado também grava uma linha de auditoria via CampaignEventService, exposta em `GET /campaign/:id/events`.
Endpoints HTTP
18 endpoints
Lista paginada de campanhas. Filtre por status (draft, scheduled, sending, paused, completed, canceled, failed) e canal.
- Query
- page, pageSize, search, status, channel
Cria uma nova campanha com status draft.
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
| channel | "email" | no | Default: "email" |
| subject | string | no | Email subject line |
| content_html | string | no | HTML email body |
| content_text | string | no | Plain-text fallback body |
| template_id | number | no | Use a saved template for content |
| recipient_list_id | number | no | Default recipient list |
| scheduled_at | string (ISO 8601) | no | Schedule send time |
| integration_profile_id | number | no | Mail delivery profile (e.g. AWS SES) |
| metadata | object | no | Arbitrary metadata |
Exclusão em massa de campanhas. Apenas campanhas com status draft, canceled ou failed podem ser excluídas.
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| ids | number[] | yes | IDs to delete |
Obtém uma campanha por ID, incluindo os detalhes do seu perfil de integração vinculado.
- Params
- id (int)
Atualiza os campos da campanha. Apenas os campos fornecidos são alterados.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string | no | — |
| channel | "email" | no | — |
| subject | string | no | — |
| content_html | string | no | — |
| content_text | string | no | — |
| template_id | number | no | — |
| recipient_list_id | number | no | — |
| scheduled_at | string (ISO 8601) | no | — |
| integration_profile_id | number | no | — |
| metadata | object | no | — |
Exclui uma única campanha. Deve estar com status draft, canceled ou failed.
- Params
- id (int)
Dashboard global de campanhas com estatísticas agregadas de entrega em todas as campanhas, incluindo um histórico de envios de 7/30 dias e o contexto de rate-limit.
Dashboard por campanha com contadores de entrega, percentual de progresso do envio, eventos recentes de ciclo de vida, erros recentes de entrega e o contexto de rate-limit.
- Params
- id (int)
Obtém o registro da campanha combinado com estatísticas agregadas de mensagens, agrupadas por status da mensagem.
- Params
- id (int)
Log de auditoria dos eventos de ciclo de vida de uma campanha (created, scheduled, queued, sending_started, sent, failed, completed, canceled, paused, resumed, open, click, unsubscribed, test_sent, etc.).
- Params
- id (int)
- Query
- page, pageSize, event_type
Agenda uma campanha para entrega futura. Define o status como "scheduled".
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| scheduled_at | string (ISO 8601) | yes | Target dispatch date/time |
Dispara imediatamente uma campanha. Valida conteúdo/perfil/lista, deduplica e filtra destinatários suprimidos, cria linhas campaign_message pendentes em uma transação e então enfileira um job de entrega por mensagem (ou envia inline se a fila estiver desabilitada).
- Params
- id (int)
Alias para /start. Dispara imediatamente a campanha.
- Params
- id (int)
Enfileira um único e-mail de teste desta campanha para um endereço especificado. Não cria uma linha campaign_message nem afeta os contadores da campanha.
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| string | yes | Test recipient email address | |
| name | string | no | Test recipient display name |
Cancela uma campanha. Define o status como "canceled"; o worker de e-mail pula quaisquer mensagens ainda em andamento desta campanha.
- Params
- id (int)
Pausa uma campanha em envio. Define o status como "paused" sem alterar as mensagens em andamento ou os jobs de fila.
- Params
- id (int)
Retoma uma campanha pausada. Redefine o status para "sending"; chamar /start em seguida continua de onde a fila parou.
- Params
- id (int)
Duplica uma campanha em um novo rascunho com "(copy)" anexado ao nome. Contadores de entrega, timestamps e agendamento são redefinidos.
- Params
- id (int)