fix: add unit type for piece items

This commit is contained in:
2026-06-23 14:25:09 +03:00
parent 1d226d9aaf
commit 349b092d02
3 changed files with 28 additions and 8 deletions
+13
View File
@@ -1,6 +1,8 @@
package handlers package handlers
import ( import (
"fmt"
"math"
"net/http" "net/http"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -27,6 +29,13 @@ func GetCart(c *gin.Context) {
c.JSON(http.StatusOK, cartItems) c.JSON(http.StatusOK, cartItems)
} }
func isValidQuantity(item models.Item, quantity float64) bool {
if item.UnitType == "piece" {
return quantity == math.Trunc(quantity)
}
return true
}
func AddToCart(c *gin.Context) { func AddToCart(c *gin.Context) {
userID := getUserID(c) userID := getUserID(c)
@@ -47,6 +56,10 @@ func AddToCart(c *gin.Context) {
return return
} }
if !isValidQuantity(item, req.Quantity) {
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Errorf("товар %s продается поштучно, дробное количество недопустимо", item.Name)})
}
if req.Quantity > item.Stock { if req.Quantity > item.Stock {
c.JSON(http.StatusBadRequest, gin.H{"error": "Недостаточно товара на складе"}) c.JSON(http.StatusBadRequest, gin.H{"error": "Недостаточно товара на складе"})
} }
+14 -8
View File
@@ -68,29 +68,35 @@ func UpdateItem(c *gin.Context) {
} }
database.DB.Model(&item).Updates(models.Item{ database.DB.Model(&item).Updates(models.Item{
Name: input.Name, Name: input.Name,
Unit: input.Unit, Unit: input.Unit,
City: input.City, UnitType: input.UnitType,
Price: input.Price, City: input.City,
Price: input.Price,
}) })
c.JSON(http.StatusOK, item) c.JSON(http.StatusOK, item)
} }
func AddItem(c *gin.Context) { func AddItem(c *gin.Context) {
var input models.Item var item models.Item
if err := c.ShouldBindJSON(&input); err != nil { if err := c.ShouldBindJSON(&item); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Неверные данные"}) c.JSON(http.StatusBadRequest, gin.H{"error": "Неверные данные"})
return return
} }
if err := database.DB.Create(&input).Error; err != nil { if item.UnitType != "weight" && item.UnitType != "piece" {
c.JSON(http.StatusBadRequest, gin.H{"error": "Товар должен быть весовым или штучным"})
return
}
if err := database.DB.Create(&item).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Не удалось создать товар"}) c.JSON(http.StatusInternalServerError, gin.H{"error": "Не удалось создать товар"})
return return
} }
c.JSON(http.StatusCreated, input) c.JSON(http.StatusCreated, item)
} }
func DeleteItem(c *gin.Context) { func DeleteItem(c *gin.Context) {
+1
View File
@@ -7,6 +7,7 @@ type Item struct {
Name string `json:"name"` Name string `json:"name"`
City string `json:"city"` City string `json:"city"`
Unit string `json:"unit"` Unit string `json:"unit"`
UnitType string `json:"unit_type" gorm:"default:'weight'"`
Price int `json:"price"` Price int `json:"price"`
Category string `json:"category"` Category string `json:"category"`
Stock float64 `gorm:"default:0" json:"stock"` Stock float64 `gorm:"default:0" json:"stock"`