diff --git a/cmd/cart/checkout_server.go b/cmd/cart/checkout_server.go index 4c4e6a9..b724fc0 100644 --- a/cmd/cart/checkout_server.go +++ b/cmd/cart/checkout_server.go @@ -129,6 +129,13 @@ func (a *App) HandleCheckoutRequests(amqpUrl string, mux *http.ServeMux) { } log.Printf("Klarna order validation: %s", order.ID) + // inventoryRequests := getInventoryRequests(grain.Items) + // failingRequest, err := s.inventoryService.ReservationCheck(inventoryRequests...) + // if err != nil { + // logger.WarnContext(ctx, "inventory check failed", string(failingRequest.SKU), string(failingRequest.LocationID)) + // return nil, err + // } + w.WriteHeader(http.StatusOK) }) } diff --git a/cmd/cart/main.go b/cmd/cart/main.go index c6a479b..8b8f38b 100644 --- a/cmd/cart/main.go +++ b/cmd/cart/main.go @@ -19,9 +19,11 @@ import ( "git.tornberg.me/go-cart-actor/pkg/promotions" "git.tornberg.me/go-cart-actor/pkg/proxy" "git.tornberg.me/go-cart-actor/pkg/voucher" + "git.tornberg.me/mats/go-redis-inventory/pkg/inventory" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/redis/go-redis/v9" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) @@ -45,6 +47,8 @@ type App struct { var podIp = os.Getenv("POD_IP") var name = os.Getenv("POD_NAME") var amqpUrl = os.Getenv("AMQP_URL") +var redisAddress = os.Getenv("REDIS_ADDRESS") +var redisPassword = os.Getenv("REDIS_PASSWORD") func getCountryFromHost(host string) string { if strings.Contains(strings.ToLower(host), "-no") { @@ -119,8 +123,17 @@ func main() { } klarnaClient := NewKlarnaClient(KlarnaPlaygroundUrl, os.Getenv("KLARNA_API_USERNAME"), os.Getenv("KLARNA_API_PASSWORD")) + rdb := redis.NewClient(&redis.Options{ + Addr: redisAddress, + Password: redisPassword, + DB: 0, + }) + inventoryService, err := inventory.NewRedisInventoryService(rdb, context.Background()) + if err != nil { + log.Fatalf("Error creating inventory service: %v\n", err) + } - syncedServer := NewPoolServer(pool, fmt.Sprintf("%s, %s", name, podIp), klarnaClient) + syncedServer := NewPoolServer(pool, fmt.Sprintf("%s, %s", name, podIp), klarnaClient, inventoryService) app := &App{ pool: pool, diff --git a/cmd/cart/pool-server.go b/cmd/cart/pool-server.go index 296ff64..436ce66 100644 --- a/cmd/cart/pool-server.go +++ b/cmd/cart/pool-server.go @@ -15,6 +15,7 @@ import ( "git.tornberg.me/go-cart-actor/pkg/cart" messages "git.tornberg.me/go-cart-actor/pkg/messages" "git.tornberg.me/go-cart-actor/pkg/voucher" + "git.tornberg.me/mats/go-redis-inventory/pkg/inventory" "github.com/gogo/protobuf/proto" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -40,15 +41,17 @@ var ( type PoolServer struct { actor.GrainPool[*cart.CartGrain] - pod_name string - klarnaClient *KlarnaClient + pod_name string + klarnaClient *KlarnaClient + inventoryService inventory.InventoryService } -func NewPoolServer(pool actor.GrainPool[*cart.CartGrain], pod_name string, klarnaClient *KlarnaClient) *PoolServer { +func NewPoolServer(pool actor.GrainPool[*cart.CartGrain], pod_name string, klarnaClient *KlarnaClient, inventoryService inventory.InventoryService) *PoolServer { return &PoolServer{ - GrainPool: pool, - pod_name: pod_name, - klarnaClient: klarnaClient, + GrainPool: pool, + pod_name: pod_name, + klarnaClient: klarnaClient, + inventoryService: inventoryService, } } @@ -310,6 +313,25 @@ func getLocale(country string) string { return "sv-se" } +func getLocationId(item *cart.CartItem) inventory.LocationID { + if item.StoreId == nil || *item.StoreId == "" { + return "se" + } + return inventory.LocationID(*item.StoreId) +} + +func getInventoryRequests(items []*cart.CartItem) []inventory.ReserveRequest { + var requests []inventory.ReserveRequest + for _, item := range items { + requests = append(requests, inventory.ReserveRequest{ + SKU: inventory.SKU(item.Sku), + LocationID: getLocationId(item), + Quantity: uint32(item.Quantity), + }) + } + return requests +} + func (s *PoolServer) CreateOrUpdateCheckout(ctx context.Context, host string, id cart.CartId) (*CheckoutOrder, error) { country := getCountryFromHost(host) meta := &CheckoutMeta{ @@ -329,6 +351,13 @@ func (s *PoolServer) CreateOrUpdateCheckout(ctx context.Context, host string, id return nil, err } + inventoryRequests := getInventoryRequests(grain.Items) + failingRequest, err := s.inventoryService.ReservationCheck(inventoryRequests...) + if err != nil { + logger.WarnContext(ctx, "inventory check failed", string(failingRequest.SKU), string(failingRequest.LocationID)) + return nil, err + } + // Build pure checkout payload payload, _, err := BuildCheckoutOrderPayload(grain, meta) if err != nil {