more fancy features
This commit is contained in:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user