add(backend) Сделано API под корзину

This commit is contained in:
2026-06-22 21:12:48 +03:00
parent 814b93621d
commit a73d147e12
5 changed files with 130 additions and 2 deletions
+1 -1
View File
@@ -20,5 +20,5 @@ func InitDB() {
log.Fatal("Failed to connect to database:", err) log.Fatal("Failed to connect to database:", err)
} }
DB.AutoMigrate(&models.Item{}, &models.User{}) DB.AutoMigrate(&models.Item{}, &models.User{}, &models.CartItem{})
} }
+108
View File
@@ -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": "Товар удален из корзины"})
}
+4
View File
@@ -48,6 +48,10 @@ func main() {
protected.DELETE("/items/:id", handlers.DeleteItem) protected.DELETE("/items/:id", handlers.DeleteItem)
protected.PATCH("/items/:id", handlers.UpdateItem) protected.PATCH("/items/:id", handlers.UpdateItem)
protected.POST("/items", handlers.AddItem) protected.POST("/items", handlers.AddItem)
protected.GET("/cart/", handlers.GetCart)
protected.POST("/cart/", handlers.AddToCart)
protected.PATCH("/cart/:id", handlers.UpdateCartItem)
protected.DELETE("/cart/:id", handlers.RemoveFromCart)
} }
admin := protected.Group("/") admin := protected.Group("/")
+16
View File
@@ -0,0 +1,16 @@
package models
import (
"time"
)
type CartItem struct {
ID uint `json:"id" gorm:"primaryKey"`
UserID uint `json:"user_id" gorm:"not null;uniqueIndex;idx_user_item"`
ItemID uint `json:"item_id" gorm:"not null;uniqueIndex;idx_user_item"`
Quantity float64 `json:"quantity" gorm:"not null;default:1"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Item Item `json:"item" gorm:"foreignKey:ItemID"`
}
+1 -1
View File
@@ -6,7 +6,7 @@ type User struct {
gorm.Model `json:"-"` gorm.Model `json:"-"`
Username string `gorm:"unique;not null" binding:"required"` Username string `gorm:"unique;not null" binding:"required"`
Password string `gorm:"not null" json:"-" binding:"required,min=8"` Password string `gorm:"not null" json:"-" binding:"required,min=8"`
Role string `gorm:"default:'Рабочий'" json:"role"` Role string `gorm:"default:'customer'" json:"role"`
FirstName string `json:"first_name" binding:"required"` FirstName string `json:"first_name" binding:"required"`
LastName string `gorm:"index" json:"last_name" binding:"required"` LastName string `gorm:"index" json:"last_name" binding:"required"`
Phone string `gorm:"index" json:"phone"` Phone string `gorm:"index" json:"phone"`