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:
- Injetar use case(s) no
constructor. - Extrair
companyIddo request. - Receber DTOs em
@Body()/@Query()(validados globalmente). - Opcionalmente usar decorators de contexto (
@Pagination(),@SendTo()). 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)
| Middleware | App | Arquivo |
|---|---|---|
AuthenticationMiddleware | Main | src/infra/http/middlewares/authentication.middleware.ts |
CompanyMiddleware | Public | src/infra/http-public/... |
InternalMiddleware | Internal | src/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/
| Componente | Função |
|---|---|
GCIPermissionGuard | APP_GUARD global; lê @Permission() e valida via UserRepositoryGateway |
CustomerGuard | Garante que rotas @AsCustomer() só aceitem tokens de customer |
@Permission(PERMISSION.X) | Metadata de permissão requerida |
@Pagination() | Lê 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
- Três aplicações HTTP
- Assíncrono e workers — header
send-email - Entities, DTOs e Knex rows