feat(payments): add Order & Escrow entities with CQRS commands, Prisma schema

- Add Order entity with lifecycle (pending → paid → completed/cancelled/refunded)
- Add Escrow entity with hold/release/dispute flow for secure transactions
- Add PlatformFee value object with tiered commission calculation
- Implement CQRS: CreateOrder, CancelOrder, HoldEscrow, ReleaseEscrow commands
- Add GetOrderStatus query handler
- Add OrdersController with REST endpoints and DTOs
- Add Prisma models for Order, Escrow, EscrowStatusHistory
- Add domain event classes for order and escrow state changes
- Add unit tests for Order, Escrow entities and PlatformFee VO
- Update PROJECT_TRACKER to Wave 14 status

Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ho Ngoc Hai
2026-04-12 23:40:00 +07:00
parent 836499c1cf
commit 2c97f99214
42 changed files with 1786 additions and 34 deletions

View File

@@ -1,6 +1,24 @@
export { PaymentsModule } from './payments.module';
// Repositories
export { ESCROW_REPOSITORY, type IEscrowRepository } from './domain/repositories/escrow.repository';
export { ORDER_REPOSITORY, type IOrderRepository } from './domain/repositories/order.repository';
export { PAYMENT_REPOSITORY, type IPaymentRepository } from './domain/repositories/payment.repository';
// Gateway
export { PAYMENT_GATEWAY_FACTORY, type IPaymentGatewayFactory } from './infrastructure/services/payment-gateway.interface';
// Domain Events — Payment
export { PaymentCompletedEvent } from './domain/events/payment-completed.event';
export { PaymentFailedEvent } from './domain/events/payment-failed.event';
export { PaymentRefundedEvent } from './domain/events/payment-refunded.event';
// Domain Events — Order
export { OrderCreatedEvent } from './domain/events/order-created.event';
export { OrderCancelledEvent } from './domain/events/order-cancelled.event';
export { OrderPaidEvent } from './domain/events/order-paid.event';
// Domain Events — Escrow
export { EscrowDisputedEvent } from './domain/events/escrow-disputed.event';
export { EscrowHeldEvent } from './domain/events/escrow-held.event';
export { EscrowReleasedEvent } from './domain/events/escrow-released.event';