Etapa 7 — Motor de alertas (BullMQ)

Adiciona um processo worker separado do processo web (src/worker.ts,
WorkerModule) com dois crons diários e processors do BullMQ para alertas
de mensalidade (master→tenant) e cobrança (tenant→customer): marca
faturas/parcelas atrasadas, resolve template com fallback tenant→master
por canal, renderiza placeholders, dispara WhatsApp/e-mail com retry e
backoff exponencial, e grava alert_logs com idempotência por dia.

Módulo alerts (web) traz o CRUD de alert_templates (master e tenant) e a
consulta de alert_logs com filtros. alert_templates/alert_logs não têm
RLS no schema, então o isolamento entre tenants é feito manualmente
(PrismaMasterService + filtro por tenant_id), coberto por teste e2e
dedicado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 22:50:59 -03:00
co-authored by Claude Sonnet 5
parent 7daaa16935
commit d6d7d5fa61
37 changed files with 2661 additions and 19 deletions
+19
View File
@@ -20,6 +20,25 @@ services:
retries: 5
start_period: 10s
worker:
build:
context: .
target: production
command: ['node', 'dist/worker']
restart: unless-stopped
env_file:
- .env
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
# Sem HTTP: os dois crons diários (`AlertSchedulerService`) e os
# processors do BullMQ mantêm o processo vivo. Escala independente do
# `app` — ex: `docker compose up --scale worker=3` — sem duplicar o
# disparo dos crons (eles não vivem no processo `app`, ver
# `src/worker/worker.module.ts`).
postgres:
image: postgres:16-alpine
restart: unless-stopped