CRM Docs
Arquitetura Backend

Padrão Use Case

Orquestração de negócio na camada application

A camada de aplicação concentra a orquestração de negócio em classes @Injectable() em src/app/use-cases/ (~163 arquivos, organizados por pasta de feature).

Estrutura de um use case

ElementoConvenção
Arquivo{verbo}-{recurso}.use-case.ts (ex.: list-attendance.use-case.ts)
Classe{Verbo}{Recurso}UseCase (ex.: ListAttendanceUseCase)
EntradaMétodo async execute(...)
DependênciasGateways (e raramente services externos) via constructor

Exemplo simples (um gateway)

// src/app/use-cases/attendance-type/list-attendance-type.use-case.ts
@Injectable()
export class ListAttendanceTypeUseCase {
  constructor(
    private attendanceTypeRepository: AttendanceTypeRepositoryGateway,
  ) {}

  async execute(companyId: number) {
    const attendanceTypes =
      await this.attendanceTypeRepository.findAll(companyId);
    return {
      success: true,
      data: attendanceTypes.map((t) => t.getFriendlyObject()),
    };
  }
}

Exemplo complexo (múltiplos gateways + broker)

ListAttendanceUseCase injeta 7 dependências:

  • 6 *RepositoryGateway (attendance, customer, product, queues, tasks, interactions)
  • 1 BrokerGateway (para enfileirar exportação de relatório)

Quando sendEmail === true, o use case não busca dados — publica mensagem na fila e retorna reportQueued: true. O processamento pesado ocorre no consumer (Assíncrono e workers).

Convenções de retorno

SituaçãoFormato
Sucesso{ success: true, data: ... }
Falha de negócio (soft){ success: false, message: '...', data: null }
Erro HTTP / authExceções Nest (UnauthorizedException, NotFoundException, etc.)

Serialização de resposta

O padrão dominante é chamar entity.getFriendlyObject() nas entities de src/app/entities/. Isso produz objetos planos adequados para JSON.

Mappers em src/domain/mappers/ são raros — usados quando há DTO de response formal separado (ex.: ServiceOrderResponseMapper).

Registro no NestJS

Use cases não têm módulo próprio por feature. São listados no array USECASES de:

  • src/infra/http/http.module.ts
  • src/infra/http-public/http.module.ts (subset)
  • src/infra/http-internal/http.module.ts (subset)

Ao criar um use case, é obrigatório adicioná-lo ao array correspondente — caso contrário o Nest não consegue injetá-lo no controller.

Próximos tópicos

On this page