CRM Docs
Arquitetura Backend

Repository customizado

Gateways e repositories standalone para domínios complexos

Nem todo agregado cabe no modelo CRUD padrão. Domínios com joins, buscas facetadas, operações em lote ou regras de workflow usam um gateway standalone e um repository Knex standalone.

Quando não usar DefaultRepositoryGateway

  • Buscas com múltiplos filtros e paginação (search, count).
  • Operações de domínio nomeadas (mergeAttendances, closeAttendance, moveCard).
  • Joins entre várias tabelas em uma única operação.
  • Relatórios e agregações pesadas.

Exemplo de referência: Attendance

Gateway: src/app/gateways/attendance.repository.gateway.ts

Define dezenas de métodos de negócio (getAttendanceById, search, closeAttendance, etc.) sem herdar DefaultRepositoryGateway.

Repository: src/infra/database/knex/repositories/knex-attendance.repository.ts

@Injectable()
export class KnexAttendanceRepository implements AttendanceRepositoryGateway {
  constructor(private companyDbGenerator: CompanyKnexProvider) {}
  // implementação com queries Knex customizadas
}

Note: usa implements, não extends KnexDefaultRepository.

Guia de decisão

CenárioGatewayRepository Knex
Tabela simples, só CRUDextends DefaultRepositoryGateway<...>extends KnexDefaultRepository + implements Gateway
CRUD + poucas queries extrasGateway estende default + abstract extrasextends KnexDefaultRepository + métodos adicionais
Domínio complexo (atendimento, board, customer)abstract class standaloneimplements XxxGateway standalone
Integração externa (e-mail, fila){Service}GatewayImplementação em módulo infra dedicado

Outros exemplos de repositories customizados

  • KnexBoardRepository / BoardRepositoryGateway — kanban
  • KnexCustomerRepository / CustomerRepositoryGateway — cliente com vínculos
  • KnexReportRepository / ReportRepositoryGateway — relatórios
  • KnexUserRepository / UserRepositoryGateway — usuário e permissões

Próximos tópicos

On this page