CRM Docs
Arquitetura Backend

Padrão Gateway

Contratos abstratos entre application e infrastructure

Os Gateways são o mecanismo central de inversão de dependência no projeto. Eles vivem em src/app/gateways/ (~58 arquivos) e definem o que a aplicação precisa de infraestrutura, sem dizer como isso é feito.

Definição técnica

Gateways são declarados como export abstract class. No NestJS, a própria classe abstrata funciona como token de injeção — não é necessário @Inject('TOKEN') nem Symbol na maioria dos casos.

// src/app/gateways/queue.repository.gateway.ts
export abstract class QueueRepositoryGateway extends DefaultRepositoryGateway<
  QueueEntity,
  Queue,
  'CD_FILA'
> {}

Convenções de nomenclatura

TipoClasseArquivo
Persistência{Feature}RepositoryGateway{feature}.repository.gateway.ts
Infra transversal{Service}Gateway{service}.gateway.ts

Exemplos de infra transversal: BrokerGateway, EncryptGateway, EmailGateway, RedisGateway.

Tipos de gateway no projeto

TipoQuantidade aprox.DescriçãoExemplo
CRUD via DefaultRepositoryGateway~29Apenas operações padrãoQueueRepositoryGateway
CRUD + queries extrasVáriosEstende default + métodos abstractProductRepositoryGateway
Contrato customizado~24Domínio rico, sem herdar defaultAttendanceRepositoryGateway
Não-DB4+Mensageria, cripto, cache, e-mailBrokerGateway

Regra fundamental

Use cases dependem apenas de gateways abstratos, nunca de Knex*Repository ou classes em infra/.

A implementação concreta é registrada no módulo Nest (DatabaseModule, BrokerModule, etc.) via provide / useClass.

Gateway de infraestrutura (exemplo)

// src/app/gateways/broker.gateway.ts
export abstract class BrokerGateway {
  abstract publish(queue: string, message: object): Promise<void>;
  abstract subscribe(queue: string, handler: (msg: object) => Promise<void>): Promise<void>;
  abstract sendNotification(/* ... */): Promise<void>;
}

Use cases que precisam de filas ou notificações em tempo real injetam BrokerGateway, não RabbitMQBroker.

Próximos tópicos

On this page