package controllers import ( "fmt" "strconv" "net/http" "crypto/rand" "encoding/hex" "github.com/gin-gonic/gin" "example.com/gin/test/models" //"example.com/gin/test/services" "example.com/gin/test/repositories" ) type CartItemController interface { //CRUDController CartItemView(*gin.Context) AddItemHandler(*gin.Context) DeleteItemHandler(*gin.Context) EditItemHandler(*gin.Context) CheckoutView(*gin.Context) } type cartItemController struct {} func NewCartItemController() CartItemController { return &cartItemController{} } func generateSessionId() string { bytes := make([]byte, 16) // 16 bytes = 128 bits _, err := rand.Read(bytes) if err != nil { panic("failed to generate session ID") } return hex.EncodeToString(bytes) } func GetSessionId(ctx *gin.Context) string { sessionId, err := ctx.Cookie("session_id") if err != nil { sessionId = generateSessionId() ctx.SetCookie("session_id", sessionId, 3600, "/", "", false, true) } return sessionId } func (rc *cartItemController) NewCartItemFromForm(ctx *gin.Context) (models.CartItem, error) { sessionId := GetSessionId(ctx) shopItemIdStr := ctx.PostForm("ShopItemId") shopItemId, err := strconv.Atoi(shopItemIdStr) itemVariantIdStr := ctx.PostForm("ItemVariantId") itemVariantId, err := strconv.Atoi(itemVariantIdStr) if err != nil { return models.CartItem{}, err } quantity := 1 shopItem, err := repositories.ShopItems.GetById(shopItemIdStr) if err != nil { return models.CartItem{}, err } itemVariant, err := repositories.ShopItems.GetVariantById(itemVariantIdStr) cartItem := models.CartItem{ SessionId: sessionId, ShopItemId: uint(shopItemId), ShopItem: shopItem, ItemVariantId: uint(itemVariantId), ItemVariant: itemVariant, Quantity: quantity, } return cartItem, nil } func (rc *cartItemController) Create(c *gin.Context) { cartItem, err := rc.NewCartItemFromForm(c) if err != nil { ReplyError(c, fmt.Errorf("cartItem creation failed: %s", err)) return } _, err = repositories.CartItems.Create(cartItem) if err != nil { ReplyError(c, fmt.Errorf("cartItem creation failed: %s", err)) return } ReplyOK(c, "cartItem was created") } func (rc *cartItemController) Update(c *gin.Context) { cartItem, err := rc.NewCartItemFromForm(c) if err != nil { ReplyError(c, err) return } _, err = repositories.CartItems.Update(cartItem) if err != nil { ReplyError(c, fmt.Errorf("cartItem creation failed: %s", err)) return } ReplyOK(c, "cartItem was updated") } //func (rc *cartItemController) Delete(c *gin.Context) { // err := repositories.CartItems.DeleteBySessionId(c.Param("id")) // // if err != nil { // ReplyError(c, fmt.Errorf("cartItem deletion failed: %s", err)) // return // } // // ReplyOK(c, "cartItem was deleted") //} func (rc *cartItemController) CartItemView(c *gin.Context) { //sessionId := GetSessionId(c) //cartItems, err := repositories.CartItems.GetAllBySession(sessionId) cartItems, err := repositories.CartItems.GetAll() if err != nil { c.HTML(http.StatusBadRequest, "cart.html", gin.H{ "data": gin.H{ "error": err } }) } priceTotal := 0.0 for _, cartItem := range cartItems { priceTotal += (float64(cartItem.Quantity) * cartItem.ItemVariant.Price) } fmt.Println("PRICE TOTAL", priceTotal) data := CreateSessionData(c, gin.H{ "cartItems": cartItems, "priceTotal": fmt.Sprintf("%.2f", priceTotal), //round 2 decimals }) c.HTML(http.StatusOK, "cart.html", data) } func (rc *cartItemController) AddItemHandler(c *gin.Context) { cartItem, err := rc.NewCartItemFromForm(c) if err != nil { fmt.Println(err) c.HTML(http.StatusBadRequest, "error.html", gin.H{ "error": err }) return } _, err = repositories.CartItems.Create(cartItem) if err != nil { data := CreateSessionData(c, gin.H{ "error": err, "success": "", }) c.HTML(http.StatusOK, "cart.html", data) return } rc.CartItemView(c) } func (rc *cartItemController) DeleteItemHandler(c *gin.Context) { err := repositories.CartItems.DeleteById(c.PostForm("id")) if err != nil { fmt.Println(err) data := CreateSessionData(c, gin.H{ "error": err, "success": "", }) c.HTML(http.StatusOK, "index.html", data) } rc.CartItemView(c) } func (rc *cartItemController) EditItemHandler(c *gin.Context) { cartItemId := c.PostForm("id") cartItem, err := repositories.CartItems.GetById(cartItemId) if err != nil { fmt.Println(err) rc.CartItemView(c) return } action := c.PostForm("action") if action == "increase" { cartItem.Quantity += 1 } if action == "decrease" { cartItem.Quantity -= 1 if cartItem.Quantity == 0 { cartItem.Quantity = 1 } } _, err = repositories.CartItems.Update(cartItem) if err != nil { fmt.Println(err) } rc.CartItemView(c) } func (rc *cartItemController) CheckoutView(c *gin.Context) { c.HTML(http.StatusOK, "checkout.html", gin.H{}) }