feat: add route order

This commit is contained in:
2026-06-23 11:12:47 +03:00
parent 66070c2e73
commit c32aee50dc
3 changed files with 89 additions and 2 deletions
+3 -2
View File
@@ -10,8 +10,9 @@ import (
) )
func getUserID(c *gin.Context) uint { func getUserID(c *gin.Context) uint {
userID, _ := c.Get("user_id") val, _ := c.Get("user_id")
return userID.(uint) userID, _ := val.(uint)
return userID
} }
func GetCart(c *gin.Context) { func GetCart(c *gin.Context) {
+85
View File
@@ -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)
}
+1
View File
@@ -52,6 +52,7 @@ func main() {
protected.POST("/cart/", handlers.AddToCart) protected.POST("/cart/", handlers.AddToCart)
protected.PATCH("/cart/:id", handlers.UpdateCartItem) protected.PATCH("/cart/:id", handlers.UpdateCartItem)
protected.DELETE("/cart/:id", handlers.RemoveFromCart) protected.DELETE("/cart/:id", handlers.RemoveFromCart)
protected.POST("/orders/", handlers.CreateOrder)
} }
admin := protected.Group("/") admin := protected.Group("/")