add(backend) Сделано API под корзину
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"fishfish/database"
|
||||
"fishfish/models"
|
||||
)
|
||||
|
||||
func getUserID(c *gin.Context) uint {
|
||||
userID, _ := c.Get("user_id")
|
||||
return userID.(uint)
|
||||
}
|
||||
|
||||
func GetCart(c *gin.Context) {
|
||||
userID := getUserID(c)
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, cartItems)
|
||||
}
|
||||
|
||||
func AddToCart(c *gin.Context) {
|
||||
userID := getUserID(c)
|
||||
|
||||
var req struct {
|
||||
ItemID uint `json:"item_id" bindind:"required"`
|
||||
Quantity float64 `json:"quantity" bindind:"required,gt=0"`
|
||||
}
|
||||
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Некорректные данные"})
|
||||
return
|
||||
}
|
||||
|
||||
var item models.Item
|
||||
|
||||
if err := database.DB.First(&item, req.ItemID).Error; err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Товар не найден"})
|
||||
return
|
||||
}
|
||||
|
||||
if req.Quantity > item.Stock {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Недостаточно товара на складе"})
|
||||
}
|
||||
|
||||
var cartItem models.CartItem
|
||||
err := database.DB.Where("user_id = ? AND item_id = ?", userID, req.ItemID).First(&cartItem).Error
|
||||
if err != nil {
|
||||
|
||||
cartItem = models.CartItem{
|
||||
UserID: userID,
|
||||
ItemID: req.ItemID,
|
||||
Quantity: req.Quantity,
|
||||
}
|
||||
|
||||
database.DB.Create(&cartItem)
|
||||
} else {
|
||||
cartItem.Quantity += req.Quantity
|
||||
database.DB.Save(&cartItem)
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "Товар добавлен в корзину"})
|
||||
}
|
||||
|
||||
func UpdateCartItem(c *gin.Context) {
|
||||
userID := getUserID(c)
|
||||
cartItemID := c.Param("id")
|
||||
|
||||
var req struct {
|
||||
Quantity float64 `json:"quantity" binding:"required,gt=0"`
|
||||
}
|
||||
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Некорректные данные"})
|
||||
return
|
||||
}
|
||||
|
||||
var cartItem models.CartItem
|
||||
if err := database.DB.Where("id = ? AND user_id = ?", cartItemID, userID).First(&cartItem).Error; err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Позиция не найдена"})
|
||||
return
|
||||
}
|
||||
|
||||
cartItem.Quantity = req.Quantity
|
||||
database.DB.Save(&cartItem)
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "Количество обновлено"})
|
||||
}
|
||||
|
||||
func RemoveFromCart(c *gin.Context) {
|
||||
userID := getUserID(c)
|
||||
cartItemID := c.Param("id")
|
||||
|
||||
result := database.DB.Where("id = ? AND user_id = ? ", cartItemID, userID).Delete(&models.CartItem{})
|
||||
if result.RowsAffected == 0 {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Позиция не найдена"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "Товар удален из корзины"})
|
||||
}
|
||||
Reference in New Issue
Block a user