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
| Tipo | Classe | Arquivo |
|---|---|---|
| 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
| Tipo | Quantidade aprox. | Descrição | Exemplo |
|---|---|---|---|
CRUD via DefaultRepositoryGateway | ~29 | Apenas operações padrão | QueueRepositoryGateway |
| CRUD + queries extras | Vários | Estende default + métodos abstract | ProductRepositoryGateway |
| Contrato customizado | ~24 | Domínio rico, sem herdar default | AttendanceRepositoryGateway |
| Não-DB | 4+ | Mensageria, cripto, cache, e-mail | BrokerGateway |
Regra fundamental
Use cases dependem apenas de gateways abstratos, nunca de
Knex*Repositoryou classes eminfra/.
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
- DefaultRepositoryGateway — CRUD padronizado
- Repository customizado — quando não usar o default
- Injeção de dependências — registro
provide/useClass