Review an inventory reservation workflow

src/inventory-reservation-types.tsTypeScript
@@ -0,0 +1,42 @@
1+export interface ReservationRequest {
2+ accountId: string;
3+ requestKey: string;
4+ warehouseId: string;
5+ sku: string;
6+ quantity: number;
7+}
8+
9+export interface Reservation {
10+ id: string;
11+ accountId: string;
12+ requestKey: string;
13+ warehouseId: string;
14+ sku: string;
15+ quantity: number;
16+}
17+
18+export interface InventoryGateway {
19+ getAvailable(warehouseId: string, sku: string): Promise<number>;
20+ decrement(warehouseId: string, sku: string, quantity: number): Promise<void>;
21+}
22+
23+export interface ReservationRepository {
24+ findByRequestKey(accountId: string, requestKey: string): Promise<Reservation | null>;
25+ insert(reservation: Reservation): Promise<void>;
26+}
27+
28+export interface ReservationDependencies {
29+ ids: { next(): string };
30+ inventory: InventoryGateway;
31+ reservations: ReservationRepository;
32+}
33+
34+export class InsufficientStockError extends Error {
35+ constructor(
36+ readonly available: number,
37+ readonly requested: number,
38+ ) {
39+ super(`Requested ${requested} units, but only ${available} are available`);
40+ this.name = "InsufficientStockError";
41+ }
42+}