CRM Docs
Arquitetura Backend

Assíncrono e workers

Producer no use case, fila AMQP e consumers na infra

Operações pesadas ou demoradas não bloqueiam a requisição HTTP. O padrão é producer → fila AMQP → consumer.

Producer (use case)

// ListAttendanceUseCase — trecho simplificado
if (sendEmail) {
  await this.broker.publish(EnvConfig.BROKER_REPORTS_QUEUE, {
    companyId,
    filters: { ...filters, orderBy: resolveAttendanceReportOrderBy(filters) },
    userEmail,
  });
  return { success: true, data: { reportQueued: true, /* ... */ } };
}

O use case depende de BrokerGateway, não de RabbitMQBroker.

Consumer (infra)

Arquivo de referência: src/infra/reports/attendance-report.consumer.ts

  • @Injectable() com OnModuleInit.
  • Chama broker.subscribe() na fila de relatórios.
  • Injeta múltiplos repository gateways para buscar e enriquecer dados.
  • Reutiliza helpers compartilhados (attendance-report-export.helpers.ts).
  • Gera CSV, faz upload via AWSS3Service, envia e-mail via EmailGateway.

Este é o padrão “fat worker”: o consumer em infra orquestra lógica que espelha o use case, mas roda fora do ciclo HTTP.

Outros consumers

  • src/infra/email/application-email.consumer.ts — e-mails de aplicação enfileirados

Filas configuradas

Nomes de filas vêm de EnvConfig em src/infra/configuration.ts:

  • BROKER_NOTIFICATION_QUEUE
  • BROKER_EMAIL_QUEUE / fila de aplicação
  • BROKER_REPORTS_QUEUE (com sufixo por ambiente)

Diagrama assíncrono

Próximos tópicos

On this page