Files
ris-backend-go/services/cart/routes.go
2024-12-09 09:51:19 +07:00

78 lines
1.9 KiB
Go

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,
})
}