State machine, API contract và transaction boundary
Order status là domain state, không phải string tùy ý; transition phải atomic và bảo vệ khỏi concurrent/stale commands.
Model
Order aggregate chứa identity, customer reference, line snapshots, amount/currency, status/version và timestamps. State: PENDING_PAYMENT → CONFIRMED/FAILED/CANCELLED với guarded transitions.
API
POST /orders trả 201 hoặc 202 tùy workflow; Location/resource ID; GET status. Validate semantic constraints, consistent problem details, pagination/filter nếu list; không expose persistence entity.
Transaction
Local DB transaction giữ aggregate/outbox atomic; external call không nằm trong DB transaction dài. Optimistic locking/version ngăn lost update; unique constraints bảo vệ invariant cuối.
Concurrency tests
Hai confirmation/cancel commands, stale version và duplicate create. Kiểm chứng một legal outcome, no partial rows và error contract deterministic.