add order
This commit is contained in:
@@ -22,6 +22,8 @@ type CartItemController interface {
|
||||
EditItemHandler(*gin.Context)
|
||||
CheckoutView(*gin.Context)
|
||||
CheckoutHandler(*gin.Context)
|
||||
OrderView(*gin.Context)
|
||||
OrderHandler(*gin.Context)
|
||||
}
|
||||
|
||||
type cartItemController struct {}
|
||||
@@ -39,8 +41,8 @@ func GetShippingMethods() []models.Shipping {
|
||||
}
|
||||
}
|
||||
|
||||
func generateSessionId() string {
|
||||
bytes := make([]byte, 16) // 16 bytes = 128 bits
|
||||
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")
|
||||
@@ -52,13 +54,18 @@ func GetSessionId(ctx *gin.Context) string {
|
||||
sessionId, err := ctx.Cookie("session_id")
|
||||
|
||||
if err != nil {
|
||||
sessionId = generateSessionId()
|
||||
sessionId = generateSessionId(16)
|
||||
ctx.SetCookie("session_id", sessionId, 3600, "/", "", false, true)
|
||||
}
|
||||
|
||||
return sessionId
|
||||
}
|
||||
|
||||
func GenerateToken() string {
|
||||
return generateSessionId(8)
|
||||
}
|
||||
|
||||
|
||||
func (rc *cartItemController) NewCartItemFromForm(ctx *gin.Context) (models.CartItem, error) {
|
||||
sessionId := GetSessionId(ctx)
|
||||
shopItemIdStr := ctx.PostForm("ShopItemId")
|
||||
@@ -92,6 +99,94 @@ func (rc *cartItemController) NewCartItemFromForm(ctx *gin.Context) (models.Cart
|
||||
return cartItem, nil
|
||||
}
|
||||
|
||||
func (rc *cartItemController) NewAddressFromForm(ctx *gin.Context) (models.AddressInfo, error) {
|
||||
firstName := ctx.PostForm("firstName")
|
||||
lastName := ctx.PostForm("lastName")
|
||||
address := ctx.PostForm("address")
|
||||
postalCode := ctx.PostForm("postalCode")
|
||||
city := ctx.PostForm("city")
|
||||
country := ctx.PostForm("country")
|
||||
|
||||
if firstName == "" {
|
||||
return models.AddressInfo{}, fmt.Errorf("first name missing.")
|
||||
}
|
||||
|
||||
if lastName == "" {
|
||||
return models.AddressInfo{}, fmt.Errorf("Last name missing.")
|
||||
}
|
||||
|
||||
if address == "" {
|
||||
return models.AddressInfo{}, fmt.Errorf("address missing.")
|
||||
}
|
||||
|
||||
if postalCode == "" {
|
||||
return models.AddressInfo{}, fmt.Errorf("postalCode missing.")
|
||||
}
|
||||
|
||||
if city == "" {
|
||||
return models.AddressInfo{}, fmt.Errorf("city missing.")
|
||||
}
|
||||
|
||||
if country == "" {
|
||||
return models.AddressInfo{}, fmt.Errorf("country missing.")
|
||||
}
|
||||
|
||||
return models.AddressInfo{
|
||||
FirstName: firstName,
|
||||
LastName: lastName,
|
||||
Address: address,
|
||||
PostalCode: postalCode,
|
||||
City: city,
|
||||
Country: country,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (rc *cartItemController) NewOrderFromForm(ctx *gin.Context) (models.Order, error) {
|
||||
sessionId := GetSessionId(ctx)
|
||||
status := models.OrderStatus("Received")
|
||||
token := GenerateToken()
|
||||
email := ctx.PostForm("email")
|
||||
comment := ctx.PostForm("comment")
|
||||
shippingStr := ctx.PostForm("shippingMethod")
|
||||
|
||||
address, err := rc.NewAddressFromForm(ctx)
|
||||
if shippingStr != "pickup" {
|
||||
if err != nil {
|
||||
return models.Order{}, fmt.Errorf("Invalid address information.")
|
||||
}
|
||||
}
|
||||
|
||||
var shipping models.Shipping
|
||||
for _, shippingMethod := range GetShippingMethods() {
|
||||
if shippingMethod.Id == shippingStr {
|
||||
shipping = shippingMethod
|
||||
}
|
||||
}
|
||||
|
||||
if shipping == (models.Shipping{}) {
|
||||
return models.Order{}, fmt.Errorf("Invalid shipping method.")
|
||||
}
|
||||
|
||||
cartItems, err := repositories.CartItems.GetAllBySession(sessionId)
|
||||
|
||||
if err != nil {
|
||||
return models.Order{}, err
|
||||
}
|
||||
|
||||
cartItem := models.Order{
|
||||
SessionId: sessionId,
|
||||
Status: status,
|
||||
Token: token,
|
||||
Email: email,
|
||||
Comment: comment,
|
||||
Address: address,
|
||||
Shipping: shipping,
|
||||
CartItems: cartItems,
|
||||
}
|
||||
|
||||
return cartItem, nil
|
||||
}
|
||||
|
||||
|
||||
func (rc *cartItemController) Create(c *gin.Context) {
|
||||
cartItem, err := rc.NewCartItemFromForm(c)
|
||||
@@ -248,6 +343,45 @@ func (rc *cartItemController) CheckoutView(c *gin.Context) {
|
||||
})
|
||||
}
|
||||
|
||||
func (rc *cartItemController) CheckoutHandler(*gin.Context) {
|
||||
func (rc *cartItemController) CheckoutHandler(c *gin.Context) {
|
||||
order, err := rc.NewOrderFromForm(c)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
c.HTML(http.StatusBadRequest, "error.html", gin.H{ "error": err })
|
||||
return
|
||||
}
|
||||
|
||||
_, err = repositories.Orders.Create(order)
|
||||
if err != nil {
|
||||
data := CreateSessionData(c, gin.H{
|
||||
"error": err,
|
||||
"success": "",
|
||||
})
|
||||
|
||||
c.HTML(http.StatusOK, "cart.html", data)
|
||||
return
|
||||
}
|
||||
|
||||
data := CreateSessionData(c, gin.H{
|
||||
"error": "",
|
||||
"success": "",
|
||||
"order": order,
|
||||
"isPreview": true,
|
||||
})
|
||||
|
||||
c.HTML(http.StatusOK, "order.html", data)
|
||||
}
|
||||
|
||||
func (rc *cartItemController) OrderView(c *gin.Context) {
|
||||
shippingMethod := c.Query("shippingMethod")
|
||||
|
||||
c.HTML(http.StatusOK, "checkout.html", gin.H{
|
||||
"askAddress": (shippingMethod != "pickup"),
|
||||
"shippingMethod": shippingMethod,
|
||||
})
|
||||
}
|
||||
|
||||
func (rc *cartItemController) OrderHandler(c *gin.Context) {
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user