CRM Docs
Arquitetura Backend

HTTP e GCI

Controllers finos, middleware de autenticação e guards de permissão

Controller fino

Controllers em src/infra/http/controllers/ têm responsabilidade única: adaptar HTTP para use cases.

Padrão:

  1. Injetar use case(s) no constructor.
  2. Extrair companyId do request.
  3. Receber DTOs em @Body() / @Query() (validados globalmente).
  4. Opcionalmente usar decorators de contexto (@Pagination(), @SendTo()).
  5. return await useCase.execute(...).
// src/infra/http/controllers/attendance-type.controller.ts (conceitual)
@Get('list')
async list(@Request() req: RequestWithUser) {
  return await this.listUseCase.execute(req.user.companyId);
}

Controllers não contêm regra de negócio, joins SQL ou chamadas diretas a Knex.

Middleware (autenticação / tenant)

MiddlewareAppArquivo
AuthenticationMiddlewareMainsrc/infra/http/middlewares/authentication.middleware.ts
CompanyMiddlewarePublicsrc/infra/http-public/...
InternalMiddlewareInternalsrc/infra/http-internal/...

O middleware de autenticação usa EncryptGateway para validar JWT e repositórios para carregar req.user ou contexto de customer.

Rotas excluídas do middleware (ex.: health, auth/sign-in, docs) são configuradas em HTTPModule.configure().

GCI — Guards, Context, Injection

Pasta: src/infra/gci/

ComponenteFunção
GCIPermissionGuardAPP_GUARD global; lê @Permission() e valida via UserRepositoryGateway
CustomerGuardGarante que rotas @AsCustomer() só aceitem tokens de customer
@Permission(PERMISSION.X)Metadata de permissão requerida
@Pagination()limit e page dos headers
@SendTo()Lê header send-email para export assíncrono
@AsCustomer()Marca rota como exclusiva de customer
@User() / @Customer()Extraem dados de req.internal

A separação é clara: middleware = quem é o usuário/empresa; guard = o que o usuário pode fazer.

Próximos tópicos

On this page