Este repositório contém o código-fonte e material didático do curso de Domain Driven Design do MBA Full Cycle.
O projeto é feito com Nestjs, mas o conteúdo é independente de linguagem ou framework.
- Node.js 18+
- Docker
Suba as aplicações MySQL, RabbitMQ e Redis:
docker-compose up -dInstale as dependências do Node.js:
npm installUse o arquivo api.http como referência para fazer as requisições HTTP. Este arquivo funciona com a extensão REST Client do VSCode.
Luiz Carlos
docker-compose up -d
npx mikro-orm schema:fresh --run # sempre após testes
npm run start:dev
npx nest start emailsPara rodar testes: npm test. Após suite, rode schema:fresh novamente.
Justificativa da fronteira do agregado WaitingList:
Seguindo a discussão do curso sobre tamanho de agregados (regra do Aggregate deve ser pequeno e coeso, encapsular invariantes transacionais), a WaitingList foi modelada como agregado separado do Event. Um Event já é raiz complexa (contém coleção de Sections com Spots e invariantes de publicação/reserva), adicionar a fila de espera (com ordenação e promoção) aumentaria o tamanho além do limite razoável e misturaria responsabilidades de venda imediata com espera assíncrona. A relação é por ID (event_id + section_id), nunca por referência de objeto, mantendo consistência eventual via eventos de domínio e handlers.
Cadeia completa do cancelamento:
- Controller invoca OrderService.cancel() dentro de ApplicationService.run()
- Order.cancel() registra OrderCancelled (com event_spot_id)
- Handler OrderCancelledHandler reage: encontra Event por spot, chama markSpotAsAvailable -> remove reserva -> publica EventSpotReleased
- Handler EventSpotReleasedHandler reage: localiza WaitingList da seção, chama offerSpotToNext -> marca NOTIFIED e registra SpotOfferedToWaitingCustomer
- publishForIntegrationEvent gera SpotOffered...IntegrationEvent -> fila Bull -> IntegrationEventsPublisher -> RabbitMQ -> ConsumerService (apps/emails) loga
Artefatos:
docs/event-storming.mddocs/linguagem-ubiqua.md
A feature está 100% alinhada com o event storming feito antes da codificação.