more fancy features

This commit is contained in:
2025-11-26 18:35:08 +01:00
parent 28c9a24dac
commit 51b30de2d8
5 changed files with 128 additions and 20 deletions
+38 -5
View File
@@ -46,13 +46,13 @@ func totalReservedKey(sku SKU, locationID LocationID) string {
func (s *RedisCartReservationService) ReserveForCart(ctx context.Context, req CartReserveRequest) error {
keys := []string{
getInventoryKey(req.Sku, req.LocationID),
cartQtyKey(req.Sku, req.LocationID),
cartExpKey(req.Sku, req.LocationID),
totalReservedKey(req.Sku, req.LocationID),
getInventoryKey(req.SKU, req.LocationID),
cartQtyKey(req.SKU, req.LocationID),
cartExpKey(req.SKU, req.LocationID),
totalReservedKey(req.SKU, req.LocationID),
}
args := []interface{}{
string(req.CartId),
string(req.CartID),
req.Quantity,
int64(req.TTL.Seconds()),
}
@@ -112,6 +112,39 @@ func (s *RedisCartReservationService) GetReservationStatus(ctx context.Context,
}, nil
}
func (s *RedisCartReservationService) GetReservationSummary(ctx context.Context, sku SKU, locationID LocationID) (*ReservationSummary, error) {
qtyKey := cartQtyKey(sku, locationID)
expKey := cartExpKey(sku, locationID)
// Get reservation count
reservationCount, err := s.client.HLen(ctx, qtyKey).Result()
if err != nil {
return nil, err
}
// Get earliest release (min score in sorted set)
minScore, err := s.client.ZRangeWithScores(ctx, expKey, 0, 0).Result()
if err != nil {
return nil, err
}
var earliestRelease time.Time
if len(minScore) > 0 {
earliestRelease = time.Unix(int64(minScore[0].Score), 0)
}
// Get remaining items
remainingItems, err := s.GetAvailableInventory(ctx, sku, locationID)
if err != nil {
return nil, err
}
return &ReservationSummary{
ReservationCount: reservationCount,
EarliestRelease: earliestRelease,
RemainingItems: remainingItems,
}, nil
}
func (s *RedisCartReservationService) GetAvailableInventory(ctx context.Context, sku SKU, locationID LocationID) (int64, error) {
keys := []string{
getInventoryKey(sku, locationID),