package cart import ( "fmt" "net/http" "github.com/go-playground/validator/v10" "github.com/gorilla/mux" "sismedika.com/sas/westone/services/auth" "sismedika.com/sas/westone/types" "sismedika.com/sas/westone/utils" ) type Handler struct { store types.ProductStore orderStore types.OrderStore userStore types.UserStore } func NewHandler( store types.ProductStore, orderStore types.OrderStore, userStore types.UserStore, ) *Handler { return &Handler{ store: store, orderStore: orderStore, userStore: userStore, } } func (h *Handler) RegisterRoutes(router *mux.Router) { cart := router.PathPrefix("/cart").Subrouter() cart.Use(auth.AuthMiddleware) cart.HandleFunc("/checkout", h.handleCheckout).Methods(http.MethodPost) // router.HandleFunc("/cart/checkout", auth.WithJWTAuth(h.handleCheckout)).Methods(http.MethodPost) } func (h *Handler) handleCheckout(w http.ResponseWriter, r *http.Request) { userID := auth.GetUserIDFromContext(r.Context()) var cart types.CartCheckoutPayload if err := utils.ParseJSON(r, &cart); err != nil { utils.WriteError(w, http.StatusBadRequest, err) return } if err := utils.Validate.Struct(cart); err != nil { errors := err.(validator.ValidationErrors) utils.WriteError(w, http.StatusBadRequest, fmt.Errorf("invalid payload: %v", errors)) return } productIds, err := getCartItemsIDs(cart.Items) if err != nil { utils.WriteError(w, http.StatusBadRequest, err) return } // get products products, err := h.store.GetProductsByID(productIds) if err != nil { utils.WriteError(w, http.StatusInternalServerError, err) return } orderID, totalPrice, err := h.createOrder(products, cart.Items, userID) if err != nil { utils.WriteError(w, http.StatusBadRequest, err) return } utils.WriteJSON(w, http.StatusOK, map[string]interface{}{ "total_price": totalPrice, "order_id": orderID, }) }