2 Commits

Author SHA1 Message Date
8a7d66f815 fix #1 Cart is empty
Some checks failed
Build / test (push) Failing after 2m50s
2025-04-13 16:07:53 +02:00
fa561c921d fix #7 Order is empty bug 2025-04-13 15:43:32 +02:00

View File

@@ -7,6 +7,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"strconv" "strconv"
"strings"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
@@ -36,6 +37,22 @@ func NewCartItemController() CartItemController {
return &cartItemController{} return &cartItemController{}
} }
// getSetCookieValue retrieves the value of a cookie from the Set-Cookie header
func getSetCookieValue(c *gin.Context, cookieName string) string {
// Check the Set-Cookie headers
cookies := c.Writer.Header()["Set-Cookie"]
for _, cookie := range cookies {
if strings.HasPrefix(cookie, cookieName+"=") {
// Extract the cookie value
parts := strings.SplitN(cookie, ";", 2)
if len(parts) > 0 {
return strings.TrimPrefix(parts[0], cookieName+"=")
}
}
}
return "" // Return empty string if cookie is not found
}
func generateSessionId(length int) string { func generateSessionId(length int) string {
bytes := make([]byte, length) // 16 bytes = 128 bits bytes := make([]byte, length) // 16 bytes = 128 bits
_, err := rand.Read(bytes) _, err := rand.Read(bytes)
@@ -49,6 +66,13 @@ func GetSessionId(ctx *gin.Context) string {
sessionId, err := ctx.Cookie("session_id") sessionId, err := ctx.Cookie("session_id")
if err != nil { if err != nil {
//we need to check if we already set cookie in the response so that we dont do this multiple times
responseCookie := getSetCookieValue(ctx, "session_id")
if len(responseCookie) != 0 {
return responseCookie
}
sessionId = generateSessionId(16) sessionId = generateSessionId(16)
ctx.SetCookie("session_id", sessionId, 3600, "/", "", false, true) ctx.SetCookie("session_id", sessionId, 3600, "/", "", false, true)
} }
@@ -170,7 +194,7 @@ func (rc *cartItemController) NewOrderFromForm(ctx *gin.Context) (models.Order,
return models.Order{}, err return models.Order{}, err
} }
cartItem := models.Order{ order := models.Order{
SessionId: sessionId, SessionId: sessionId,
Status: status, Status: status,
Token: token, Token: token,
@@ -186,7 +210,7 @@ func (rc *cartItemController) NewOrderFromForm(ctx *gin.Context) (models.Order,
CartItems: cartItems, CartItems: cartItems,
} }
return cartItem, nil return order, nil
} }
func (rc *cartItemController) Create(c *gin.Context) { func (rc *cartItemController) Create(c *gin.Context) {
@@ -360,21 +384,31 @@ func (rc *cartItemController) CheckoutHandler(c *gin.Context) {
existingOrder, err := repositories.Orders.GetBySession(order.SessionId) existingOrder, err := repositories.Orders.GetBySession(order.SessionId)
if errors.Is(err, gorm.ErrRecordNotFound) { if errors.Is(err, gorm.ErrRecordNotFound) {
_, err = repositories.Orders.Create(order) fmt.Println("Creating Order")
createdOrder, err := repositories.Orders.Create(order)
if err != nil {
data := CreateSessionData(c, gin.H{
"error": err,
"success": "",
})
c.HTML(http.StatusOK, "error.html", data)
return
}
for _, cartItem := range order.CartItems {
cartItem.OrderID = createdOrder.ID
repositories.CartItems.Update(cartItem)
}
} else if err == nil { } else if err == nil {
fmt.Println("Updating Order")
order.ID = existingOrder.ID order.ID = existingOrder.ID
order.CreatedAt = existingOrder.CreatedAt order.CreatedAt = existingOrder.CreatedAt
repositories.Orders.Update(order) _, err := repositories.Orders.Update(order)
} if err != nil {
fmt.Println(err)
if err != nil { }
data := CreateSessionData(c, gin.H{
"error": err,
"success": "",
})
c.HTML(http.StatusOK, "cart.html", data)
return
} }
shipping, err := models.GetShippingMethod(order.Shipping) shipping, err := models.GetShippingMethod(order.Shipping)
@@ -384,7 +418,7 @@ func (rc *cartItemController) CheckoutHandler(c *gin.Context) {
"success": "", "success": "",
}) })
c.HTML(http.StatusOK, "cart.html", data) c.HTML(http.StatusOK, "error.html", data)
return return
} }
@@ -395,7 +429,7 @@ func (rc *cartItemController) CheckoutHandler(c *gin.Context) {
"success": "", "success": "",
}) })
c.HTML(http.StatusOK, "cart.html", data) c.HTML(http.StatusOK, "error.html", data)
return return
} }