110 lines
2.8 KiB
Go
110 lines
2.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"fishfish/database"
|
|
"fishfish/models"
|
|
)
|
|
|
|
func getUserID(c *gin.Context) uint {
|
|
val, _ := c.Get("user_id")
|
|
userID, _ := val.(uint)
|
|
return userID
|
|
}
|
|
|
|
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": "Товар удален из корзины"})
|
|
}
|