From c32aee50dc9445fa8e24d624487f72c7cabf1c64 Mon Sep 17 00:00:00 2001 From: LeonG11 Date: Tue, 23 Jun 2026 11:12:47 +0300 Subject: [PATCH] feat: add route order --- backend/handlers/cart_handler.go | 5 +- backend/handlers/order_handler.go | 85 +++++++++++++++++++++++++++++++ backend/main.go | 1 + 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 backend/handlers/order_handler.go diff --git a/backend/handlers/cart_handler.go b/backend/handlers/cart_handler.go index bda9daf..57f347f 100644 --- a/backend/handlers/cart_handler.go +++ b/backend/handlers/cart_handler.go @@ -10,8 +10,9 @@ import ( ) func getUserID(c *gin.Context) uint { - userID, _ := c.Get("user_id") - return userID.(uint) + val, _ := c.Get("user_id") + userID, _ := val.(uint) + return userID } func GetCart(c *gin.Context) { diff --git a/backend/handlers/order_handler.go b/backend/handlers/order_handler.go new file mode 100644 index 0000000..a892f87 --- /dev/null +++ b/backend/handlers/order_handler.go @@ -0,0 +1,85 @@ +package handlers + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" + + "fishfish/database" + "fishfish/models" +) + +func CreateOrder(c *gin.Context) { + userID := getUserID(c) + + var req struct { + DeliveryAddress string `json:"delivery_address" binding:"required"` + } + + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Не указан адрес доставки"}) + return + } + + var cartItems []models.CartItem + if err := database.DB.Preload("Item").Where("user_id = ? ", userID).Find(&cartItems).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Не удалось получить корзину"}) + return + } + + if len(cartItems) == 0 { + c.JSON(http.StatusBadRequest, gin.H{"error": "Корзина пуста"}) + return + } + + var order models.Order + err := database.DB.Transaction(func(tx *gorm.DB) error { + var total float64 + var orderItems []models.OrderItem + + for _, cartItem := range cartItems { + item := cartItem.Item + + result := tx.Model(&models.Item{}).Where("id = ? AND stock >= ?", item.ID, cartItem.Quantity).Update("stock", gorm.Expr("stock - ? ", cartItem.Quantity)) + + if result.RowsAffected == 0 { + return fmt.Errorf("Недостаточно товара '%s' на складе", item.Name) + } + + itemTotal := float64(item.Price) * cartItem.Quantity + total += itemTotal + + orderItems = append(orderItems, models.OrderItem{ + ItemID: cartItem.ItemID, + Quantity: cartItem.Quantity, + Price: float64(item.Price), + }) + } + + order = models.Order{ + UserID: userID, + Status: "new", + DeliveryAddress: req.DeliveryAddress, + TotalPrice: total, + Items: orderItems, + } + + if err := tx.Create(&order).Error; err != nil { + return err + } + + if err := tx.Where("user_id = ? ", userID).Delete(&models.CartItem{}).Error; err != nil { + return err + } + + return nil + }) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusCreated, order) +} diff --git a/backend/main.go b/backend/main.go index c4a2f2b..4c0c785 100644 --- a/backend/main.go +++ b/backend/main.go @@ -52,6 +52,7 @@ func main() { protected.POST("/cart/", handlers.AddToCart) protected.PATCH("/cart/:id", handlers.UpdateCartItem) protected.DELETE("/cart/:id", handlers.RemoveFromCart) + protected.POST("/orders/", handlers.CreateOrder) } admin := protected.Group("/")