101 lines
2.9 KiB
Go
101 lines
2.9 KiB
Go
package cart
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"git.k6n.net/go-cart-actor/pkg/actor"
|
|
messages "git.k6n.net/go-cart-actor/proto/cart"
|
|
"github.com/matst80/go-redis-inventory/pkg/inventory"
|
|
)
|
|
|
|
type CartMutationContext struct {
|
|
reservationService inventory.CartReservationService
|
|
}
|
|
|
|
func NewCartMutationContext(reservationService inventory.CartReservationService) *CartMutationContext {
|
|
return &CartMutationContext{
|
|
reservationService: reservationService,
|
|
}
|
|
}
|
|
|
|
func (c *CartMutationContext) ReserveItem(ctx context.Context, cartId CartId, sku string, locationId *string, quantity uint16) (*time.Time, error) {
|
|
if quantity <= 0 || c.reservationService == nil {
|
|
return nil, nil
|
|
}
|
|
l := inventory.LocationID("se")
|
|
if locationId != nil {
|
|
l = inventory.LocationID(*locationId)
|
|
}
|
|
ttl := time.Minute * 15
|
|
endTime := time.Now().Add(ttl)
|
|
err := c.reservationService.ReserveForCart(ctx, inventory.CartReserveRequest{
|
|
CartID: inventory.CartID(cartId.String()),
|
|
InventoryReference: &inventory.InventoryReference{
|
|
SKU: inventory.SKU(sku),
|
|
LocationID: l,
|
|
},
|
|
TTL: ttl,
|
|
Quantity: uint32(quantity),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &endTime, nil
|
|
|
|
}
|
|
|
|
func (c *CartMutationContext) ReleaseItem(ctx context.Context, cartId CartId, sku string, locationId *string) error {
|
|
if c.reservationService == nil {
|
|
return nil
|
|
}
|
|
l := inventory.LocationID("se")
|
|
if locationId != nil {
|
|
l = inventory.LocationID(*locationId)
|
|
}
|
|
return c.reservationService.ReleaseForCart(ctx, inventory.SKU(sku), l, inventory.CartID(cartId.String()))
|
|
}
|
|
|
|
func NewCartMultationRegistry(context *CartMutationContext) actor.MutationRegistry {
|
|
|
|
reg := actor.NewMutationRegistry()
|
|
reg.RegisterMutations(
|
|
actor.NewMutation(context.AddItem, func() *messages.AddItem {
|
|
return &messages.AddItem{}
|
|
}),
|
|
actor.NewMutation(context.ChangeQuantity, func() *messages.ChangeQuantity {
|
|
return &messages.ChangeQuantity{}
|
|
}),
|
|
actor.NewMutation(context.RemoveItem, func() *messages.RemoveItem {
|
|
return &messages.RemoveItem{}
|
|
}),
|
|
actor.NewMutation(ClearCart, func() *messages.ClearCartRequest {
|
|
return &messages.ClearCartRequest{}
|
|
}),
|
|
actor.NewMutation(AddVoucher, func() *messages.AddVoucher {
|
|
return &messages.AddVoucher{}
|
|
}),
|
|
actor.NewMutation(RemoveVoucher, func() *messages.RemoveVoucher {
|
|
return &messages.RemoveVoucher{}
|
|
}),
|
|
actor.NewMutation(UpsertSubscriptionDetails, func() *messages.UpsertSubscriptionDetails {
|
|
return &messages.UpsertSubscriptionDetails{}
|
|
}),
|
|
actor.NewMutation(SetUserId, func() *messages.SetUserId {
|
|
return &messages.SetUserId{}
|
|
}),
|
|
actor.NewMutation(LineItemMarking, func() *messages.LineItemMarking {
|
|
return &messages.LineItemMarking{}
|
|
}),
|
|
actor.NewMutation(RemoveLineItemMarking, func() *messages.RemoveLineItemMarking {
|
|
return &messages.RemoveLineItemMarking{}
|
|
}),
|
|
actor.NewMutation(SubscriptionAdded, func() *messages.SubscriptionAdded {
|
|
return &messages.SubscriptionAdded{}
|
|
}),
|
|
)
|
|
return reg
|
|
|
|
}
|