234 lines
4.8 KiB
Go
234 lines
4.8 KiB
Go
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{})
|
|
}
|