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+
}