update or create order
This commit is contained in:
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user