Lifecycle luồng đặt chỗ hoàn chỉnh, đã hiện thực + verify tự động ([booking-e2e.test.ts]). Tổng hợp từ code thật — không thiết kế lại. Engine: platform-architecture/CORE-ENGINES-BOUNDARY; ranh giới: platform-contracts/ENGINE-INTERACTION-MATRIX.
Partner ─▶ Inventory ─▶ Availability ─▶ Pricing ─▶ Booking ─▶ Audit ─▶ Database ─▶ API Response
| Bước | Engine / code | Vào | Ra |
|---|---|---|---|
| Partner → Inventory | seedStagingListings (Partner publish listing/unit) → listings/units/availability/prices | listing/unit/giá/tồn | Reservable sẵn bán |
| Availability | CheckAvailability use-case → AvailabilityRepository (adapter SELECT…FOR UPDATE); invariant Availability.canReserve (domain) | unitId, period, quantity | available, billableUnits |
| Pricing | PricingPort.unitPrice → PrismaPricingAdapter (snapshot bất biến) | unit, period | unitPriceVnd, totalVnd |
| Booking | CreateReservation use-case → Reservation aggregate (state machine pending) | request + availability + price snapshot | reservationId, code, totalVnd, status=pending |
| Audit | Kernel ctx.audit.record("reservation.created") — cùng transaction (atomic) | actor/tenant/entityRef | audit_events append-only |
| Database | PrismaReservationRepository.save → reservations + outbox booking.reservation.created (transactional) | aggregate + events | persisted atomic |
| API Response | router → ReservationView / ReservationListResult (email mask, cursor) | — | JSON contract v1 |
pending ─▶ confirmed ─▶ checked_in ─▶ checked_out
│ │
▼ ├─▶ cancelled
cancelled └─▶ no_show
booking.reservation.confirmed → Payment consume (async) tạo payment.intent.created (UNIVERSAL-BOOKING-MODEL).reservation.confirmed/cancelled) cùng transaction.| Method · Path | Vai trò |
|---|---|
GET /health | Liveness (không auth) |
GET /api/booking/availability?unitId&start&end&quantity&adults&children | Availability + Pricing (server suy listingId từ unitId) |
POST /api/booking/reservations | Booking (create); body unitId,start,end,adults,children,quantity,channel,guestName/Email/Phone |
GET /api/booking/reservations | List (tenant-scoped, keyset, email mask) |
POST /api/booking/reservations/:id/{confirm,cancel,check-in,check-out,no-show} | Lifecycle |
Auth: x-bng-api-key (production mode); không key → 401. Cross-tenant → 404. Không lộ stack/secret.
Availability (khoá FOR UPDATE), không overbook.packages/platform-infrastructure/src/__tests__/booking-e2e.test.ts (3 test): full slice · confirm→payment→audit · availability trừ tồn. 0× 5xx, response đúng contract. Demo tay: demo/BOOKING-DEMO.