update or create order

This commit is contained in:
2025-03-24 01:04:01 +01:00
parent 2fce17d528
commit 22bf9d4390
7 changed files with 124 additions and 345 deletions

View File

@@ -1,13 +1,15 @@
package controllers
import (
"crypto/rand"
"encoding/hex"
"errors"
"fmt"
"strconv"
"net/http"
"crypto/rand"
"encoding/hex"
"strconv"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"example.com/gin/test/models"
//"example.com/gin/test/services"
@@ -26,28 +28,27 @@ type CartItemController interface {
OrderHandler(*gin.Context)
}
type cartItemController struct {}
type cartItemController struct{}
func NewCartItemController() CartItemController {
return &cartItemController{}
}
func GetShippingMethods() []models.Shipping {
return []models.Shipping{
{ Id: "germany", Name: "Germany (DHL)", Price: 3.99 },
{ Id: "international", Name: "International (DHL)", Price: 5.99 },
{ Id: "pickup", Name: "Pickup", Price: 0.00 },
{Id: "germany", Name: "Germany (DHL)", Price: 3.99},
{Id: "international", Name: "International (DHL)", Price: 5.99},
{Id: "pickup", Name: "Pickup", Price: 0.00},
}
}
func generateSessionId(length int) string {
bytes := make([]byte, length) // 16 bytes = 128 bits
_, err := rand.Read(bytes)
if err != nil {
panic("failed to generate session ID")
}
return hex.EncodeToString(bytes)
bytes := make([]byte, length) // 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 {
@@ -65,7 +66,6 @@ func GenerateToken() string {
return generateSessionId(8)
}
func (rc *cartItemController) NewCartItemFromForm(ctx *gin.Context) (models.CartItem, error) {
sessionId := GetSessionId(ctx)
shopItemIdStr := ctx.PostForm("ShopItemId")
@@ -88,12 +88,12 @@ func (rc *cartItemController) NewCartItemFromForm(ctx *gin.Context) (models.Cart
itemVariant, err := repositories.ShopItems.GetVariantById(itemVariantIdStr)
cartItem := models.CartItem{
SessionId: sessionId,
ShopItemId: uint(shopItemId),
ShopItem: shopItem,
SessionId: sessionId,
ShopItemId: uint(shopItemId),
ShopItem: shopItem,
ItemVariantId: uint(itemVariantId),
ItemVariant: itemVariant,
Quantity: quantity,
ItemVariant: itemVariant,
Quantity: quantity,
}
return cartItem, nil
@@ -132,12 +132,12 @@ func (rc *cartItemController) NewAddressFromForm(ctx *gin.Context) (models.Addre
}
return models.AddressInfo{
FirstName: firstName,
LastName: lastName,
Address: address,
FirstName: firstName,
LastName: lastName,
Address: address,
PostalCode: postalCode,
City: city,
Country: country,
City: city,
Country: country,
}, nil
}
@@ -182,25 +182,24 @@ func (rc *cartItemController) NewOrderFromForm(ctx *gin.Context) (models.Order,
}
cartItem := models.Order{
SessionId: sessionId,
Status: status,
Token: token,
Email: email,
Comment: comment,
FirstName: firstName,
LastName: lastName,
Address: address,
SessionId: sessionId,
Status: status,
Token: token,
Email: email,
Comment: comment,
FirstName: firstName,
LastName: lastName,
Address: address,
PostalCode: postalCode,
City: city,
Country: country,
Shipping: shipping.Id,
CartItems: cartItems,
City: city,
Country: country,
Shipping: shipping.Id,
CartItems: cartItems,
}
return cartItem, nil
}
func (rc *cartItemController) Create(c *gin.Context) {
cartItem, err := rc.NewCartItemFromForm(c)
@@ -219,7 +218,6 @@ func (rc *cartItemController) Create(c *gin.Context) {
ReplyOK(c, "cartItem was created")
}
func (rc *cartItemController) Update(c *gin.Context) {
cartItem, err := rc.NewCartItemFromForm(c)
@@ -256,7 +254,7 @@ func (rc *cartItemController) CartItemView(c *gin.Context) {
cartItems, err := repositories.CartItems.GetAll()
if err != nil {
c.HTML(http.StatusBadRequest, "cart.html", gin.H{ "data": gin.H{ "error": err } })
c.HTML(http.StatusBadRequest, "cart.html", gin.H{"data": gin.H{"error": err}})
}
priceTotal := 0.0
@@ -267,9 +265,9 @@ func (rc *cartItemController) CartItemView(c *gin.Context) {
fmt.Println("PRICE TOTAL", priceTotal)
data := CreateSessionData(c, gin.H{
"cartItems": cartItems,
"cartItems": cartItems,
"priceTotal": fmt.Sprintf("%.2f", priceTotal), //round 2 decimals
"shipping": GetShippingMethods(),
"shipping": GetShippingMethods(),
})
c.HTML(http.StatusOK, "cart.html", data)
@@ -280,14 +278,14 @@ func (rc *cartItemController) AddItemHandler(c *gin.Context) {
if err != nil {
fmt.Println(err)
c.HTML(http.StatusBadRequest, "error.html", gin.H{ "error": 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,
"error": err,
"success": "",
})
@@ -304,7 +302,7 @@ func (rc *cartItemController) DeleteItemHandler(c *gin.Context) {
if err != nil {
fmt.Println(err)
data := CreateSessionData(c, gin.H{
"error": err,
"error": err,
"success": "",
})
@@ -351,7 +349,7 @@ func (rc *cartItemController) CheckoutView(c *gin.Context) {
shippingMethod := c.Query("shippingMethod")
c.HTML(http.StatusOK, "checkout.html", gin.H{
"askAddress": (shippingMethod != "pickup"),
"askAddress": (shippingMethod != "pickup"),
"shippingMethod": shippingMethod,
})
}
@@ -361,15 +359,25 @@ func (rc *cartItemController) CheckoutHandler(c *gin.Context) {
if err != nil {
fmt.Println(err)
c.HTML(http.StatusBadRequest, "error.html", gin.H{ "error": err })
c.HTML(http.StatusBadRequest, "error.html", gin.H{"error": err})
return
}
//TODO: should update or create here, in case user edited addressfield
_, err = repositories.Orders.Create(order)
existingOrder, err := repositories.Orders.GetBySession(order.SessionId)
if errors.Is(err, gorm.ErrRecordNotFound) {
fmt.Println("CREATE")
_, err = repositories.Orders.Create(order)
} else if err == nil {
fmt.Println("UPDATE")
order.ID = existingOrder.ID
order.CreatedAt = existingOrder.CreatedAt
repositories.Orders.Update(order)
}
if err != nil {
data := CreateSessionData(c, gin.H{
"error": err,
"error": err,
"success": "",
})
@@ -377,7 +385,6 @@ func (rc *cartItemController) CheckoutHandler(c *gin.Context) {
return
}
var shipping models.Shipping
for _, shippingMethod := range GetShippingMethods() {
if shippingMethod.Id == order.Shipping {
@@ -393,14 +400,14 @@ func (rc *cartItemController) CheckoutHandler(c *gin.Context) {
priceTotal := priceProducts + shipping.Price
data := CreateSessionData(c, gin.H{
"error": "",
"success": "",
"order": order,
"askAddress": (order.Shipping != "pickup"),
"isPreview": true,
"shipping": shipping,
"error": "",
"success": "",
"order": order,
"askAddress": (order.Shipping != "pickup"),
"isPreview": true,
"shipping": shipping,
"priceProducts": fmt.Sprintf("%.2f", priceProducts), //round 2 decimals
"priceTotal": fmt.Sprintf("%.2f", priceTotal), //round 2 decimals
"priceTotal": fmt.Sprintf("%.2f", priceTotal), //round 2 decimals
})
fmt.Println(order)
@@ -411,7 +418,7 @@ func (rc *cartItemController) OrderView(c *gin.Context) {
shippingMethod := c.Query("shippingMethod")
c.HTML(http.StatusOK, "checkout.html", gin.H{
"askAddress": (shippingMethod != "pickup"),
"askAddress": (shippingMethod != "pickup"),
"shippingMethod": shippingMethod,
})
}