Arquitetura Backend
Adicionar uma nova feature
Checklist e walkthroughs CRUD simples e domínio complexo
Checklist para implementar uma feature seguindo os padrões do projeto.
Passo a passo
- DTOs — Criar input/output em
src/domain/dtos/{feature}/comclass-validatore@ApiProperty. - Enums — Se necessário, adicionar em
src/domain/enums/. - Entity — Se houver modelo de domínio, criar
src/app/entities/{feature}.entity.tscomgetFriendlyObject(). - Escolher padrão de gateway — Default CRUD vs. custom (ver Repository customizado).
- Gateway — Criar
src/app/gateways/{feature}.repository.gateway.ts. - Knex row — Se persistência nova, tipo em
src/infra/database/knex/entities/. - Mapper —
src/infra/database/knex/mappers/{feature}.tsimplementandoMapperGateway. - Repository —
src/infra/database/knex/repositories/knex-{feature}.repository.ts. - DatabaseModule — Registrar
{ provide: XxxGateway, useClass: KnexXxxRepository }. - Use case(s) —
src/app/use-cases/{feature}/{action}-{feature}.use-case.ts. - HTTPModule — Adicionar use case(s) ao array
USECASES(e módulos public/internal se aplicável). - Controller — Endpoint em
src/infra/http/controllers/{feature}.controller.ts. - Testes —
test/unit/espelhando a camada alterada. - Permissões — Se rota restrita,
@Permission(PERMISSION.X)e enum correspondente.
Walkthrough A — CRUD simples (Attendance Type)
Fluxo completo para listar tipos de atendimento.
| # | Camada | Arquivo |
|---|---|---|
| 1 | Controller | src/infra/http/controllers/attendance-type.controller.ts |
| 2 | Use case | src/app/use-cases/attendance-type/list-attendance-type.use-case.ts |
| 3 | Gateway | src/app/gateways/attendance-type.repository.gateway.ts (extends DefaultRepositoryGateway) |
| 4 | Repository | src/infra/database/knex/repositories/knex-attendance-type.repository.ts |
| 5 | Provider | CompanyKnexProvider.connectByCompanyId(companyId) |
Sequência:
GET /attendance-type/list
→ AttendanceTypeController.list(req)
→ ListAttendanceTypeUseCase.execute(companyId)
→ AttendanceTypeRepositoryGateway.findAll(companyId)
→ KnexAttendanceTypeRepository (KnexDefaultRepository)
→ Mapper → AttendanceTypeEntity[]
→ getFriendlyObject() → { success: true, data: [...] }Este é o caminho mais rápido para tabelas de cadastro: gateway vazio que só estende default, repository com super() no constructor.
Walkthrough B — Domínio complexo (Attendance search + export)
Fluxo para busca paginada e exportação assíncrona por e-mail.
| # | Camada | Arquivo |
|---|---|---|
| 1 | Controller | src/infra/http/controllers/attendance.controller.ts (POST search) |
| 2 | DTO | src/domain/dtos/attendance/list-attendance.dto.ts |
| 3 | Use case | src/app/use-cases/attendance/list-attendance.use-case.ts |
| 4 | Gateway principal | src/app/gateways/attendance.repository.gateway.ts (custom) |
| 5 | Gateways auxiliares | customer, product, queue, task, interaction, avaliation |
| 6 | Broker | BrokerGateway.publish quando sendEmail === true |
| 7 | Consumer | src/infra/reports/attendance-report.consumer.ts |
Sequência (busca normal):
POST /attendance/search
→ AttendanceController + @Pagination() + ListAttendanceDTO
→ ListAttendanceUseCase.executePaginated(companyId, filters, pagination)
→ AttendanceRepositoryGateway.search(...)
→ enrichAttendances() com outros gateways
→ { success: true, data: { attendances, totalAttendances } }Sequência (export por e-mail):
POST /attendance/search + header send-email
→ ListAttendanceUseCase.execute(..., sendEmail: true)
→ BrokerGateway.publish(BROKER_REPORTS_QUEUE, { companyId, filters, userEmail })
→ resposta imediata { reportQueued: true }
→ (async) AttendanceReportConsumer → gateways → CSV → S3 → EmailGatewayEste walkthrough mostra composição de múltiplos gateways, integração com broker e separação entre caminho síncrono e assíncrono no mesmo use case.
Referências de código
| Padrão | Arquivo |
|---|---|
| Default gateway | src/app/gateways/default.repository.gateway.ts |
| Default Knex repo | src/infra/database/knex/repositories/knex-default.repository.ts |
| Gateway CRUD mínimo | src/app/gateways/queue.repository.gateway.ts |
| Repository CRUD mínimo | src/infra/database/knex/repositories/knex-queue.repository.ts |
| Use case simples | src/app/use-cases/attendance-type/list-attendance-type.use-case.ts |
| Use case complexo | src/app/use-cases/attendance/list-attendance.use-case.ts |
| Controller | src/infra/http/controllers/attendance.controller.ts |
| Report consumer | src/infra/reports/attendance-report.consumer.ts |