better ucp conformance
This commit is contained in:
@@ -45,12 +45,70 @@ func (s *CheckoutServer) handleCreateCheckout(w http.ResponseWriter, r *http.Req
|
||||
writeError(w, http.StatusBadRequest, "invalid request body: "+err.Error())
|
||||
return
|
||||
}
|
||||
if req.CartId == "" {
|
||||
writeError(w, http.StatusBadRequest, "cartId is required")
|
||||
|
||||
items := req.Items
|
||||
if len(items) == 0 && len(req.LineItems) > 0 {
|
||||
items = req.LineItems
|
||||
}
|
||||
|
||||
var cartIdStr string
|
||||
if req.CartId != "" {
|
||||
cartIdStr = req.CartId
|
||||
} else if len(items) > 0 {
|
||||
// Fetch cart base URL
|
||||
cartBaseURL := os.Getenv("CART_INTERNAL_URL")
|
||||
if cartBaseURL == "" {
|
||||
cartBaseURL = "http://cart:8080"
|
||||
}
|
||||
|
||||
// Prepare POST request to /ucp/v1/carts/ to create and seed the cart
|
||||
createReqBody := CreateCartRequest{
|
||||
Items: items,
|
||||
}
|
||||
bodyBytes, err := json.Marshal(createReqBody)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "failed to marshal create cart request: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
client := &http.Client{Timeout: 10 * time.Second}
|
||||
cartReq, err := http.NewRequestWithContext(r.Context(), "POST", fmt.Sprintf("%s/ucp/v1/carts/", cartBaseURL), bytes.NewReader(bodyBytes))
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "failed to create post cart request: "+err.Error())
|
||||
return
|
||||
}
|
||||
cartReq.Header.Set("Content-Type", "application/json")
|
||||
|
||||
profile := os.Getenv("UCP_AGENT_PROFILE")
|
||||
if profile == "" {
|
||||
profile = DefaultUCPAgentProfile
|
||||
}
|
||||
cartReq.Header.Set("UCP-Agent", `profile="`+profile+`"`)
|
||||
|
||||
cartResp, err := client.Do(cartReq)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "failed to create implicit cart: "+err.Error())
|
||||
return
|
||||
}
|
||||
defer cartResp.Body.Close()
|
||||
|
||||
if cartResp.StatusCode != http.StatusCreated && cartResp.StatusCode != http.StatusOK {
|
||||
writeError(w, http.StatusBadRequest, fmt.Sprintf("cart service returned status: %d when creating implicit cart", cartResp.StatusCode))
|
||||
return
|
||||
}
|
||||
|
||||
var cartRespBody CartResponse
|
||||
if err := json.NewDecoder(cartResp.Body).Decode(&cartRespBody); err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "failed to decode implicit cart response: "+err.Error())
|
||||
return
|
||||
}
|
||||
cartIdStr = cartRespBody.Id
|
||||
} else {
|
||||
writeError(w, http.StatusBadRequest, "cartId or items/line_items is required")
|
||||
return
|
||||
}
|
||||
|
||||
cartId, ok := cart.ParseCartId(req.CartId)
|
||||
cartId, ok := cart.ParseCartId(cartIdStr)
|
||||
if !ok {
|
||||
writeError(w, http.StatusBadRequest, "invalid cartId")
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user