package handler import ( "net/http" "github.com/gin-gonic/gin" "gorm.io/gorm" "github.com/wangjia/jiu/backend/internal/middleware" "github.com/wangjia/jiu/backend/internal/model" "github.com/wangjia/jiu/backend/internal/util" ) // ProductAttrHandler 处理商品属性字典(产地/保质期/储存方式/描述文档) type ProductAttrHandler struct { db *gorm.DB } func NewProductAttrHandler(db *gorm.DB) *ProductAttrHandler { return &ProductAttrHandler{db: db} } // ── 产地(origins) ────────────────────────────────────────────── func (h *ProductAttrHandler) ListOrigins(c *gin.Context) { shopID := middleware.GetShopID(c) items := make([]model.ProductOriginOption, 0) h.db.Where("shop_id = ?", shopID).Order("id ASC").Find(&items) util.RespondSuccess(c, items) } func (h *ProductAttrHandler) CreateOrigin(c *gin.Context) { shopID := middleware.GetShopID(c) var req struct { Code string `json:"code"` Name string `json:"name" binding:"required"` Remark string `json:"remark"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } item := model.ProductOriginOption{ TenantBase: model.TenantBase{ShopID: shopID}, Code: req.Code, Name: req.Name, Remark: req.Remark, } if err := h.db.Create(&item).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } util.RespondCreated(c, item) } func (h *ProductAttrHandler) UpdateOrigin(c *gin.Context) { shopID := middleware.GetShopID(c) var req struct { Code string `json:"code"` Name string `json:"name" binding:"required"` Remark string `json:"remark"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var item model.ProductOriginOption if err := h.db.Where("id = ? AND shop_id = ?", c.Param("id"), shopID).First(&item).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "not found"}) return } h.db.Model(&item).Where("shop_id = ?", shopID).Updates(map[string]interface{}{ "code": req.Code, "name": req.Name, "remark": req.Remark, }) util.RespondSuccess(c, item) } func (h *ProductAttrHandler) DeleteOrigin(c *gin.Context) { shopID := middleware.GetShopID(c) h.db.Where("id = ? AND shop_id = ?", c.Param("id"), shopID).Delete(&model.ProductOriginOption{}) c.JSON(http.StatusOK, gin.H{"message": "deleted"}) } // ── 保质期(shelf-lives) ───────────────────────────────────────── func (h *ProductAttrHandler) ListShelfLives(c *gin.Context) { shopID := middleware.GetShopID(c) items := make([]model.ProductShelfLifeOption, 0) h.db.Where("shop_id = ?", shopID).Order("id ASC").Find(&items) util.RespondSuccess(c, items) } func (h *ProductAttrHandler) CreateShelfLife(c *gin.Context) { shopID := middleware.GetShopID(c) var req struct { Code string `json:"code"` Name string `json:"name" binding:"required"` Remark string `json:"remark"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } item := model.ProductShelfLifeOption{ TenantBase: model.TenantBase{ShopID: shopID}, Code: req.Code, Name: req.Name, Remark: req.Remark, } if err := h.db.Create(&item).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } util.RespondCreated(c, item) } func (h *ProductAttrHandler) UpdateShelfLife(c *gin.Context) { shopID := middleware.GetShopID(c) var req struct { Code string `json:"code"` Name string `json:"name" binding:"required"` Remark string `json:"remark"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var item model.ProductShelfLifeOption if err := h.db.Where("id = ? AND shop_id = ?", c.Param("id"), shopID).First(&item).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "not found"}) return } h.db.Model(&item).Where("shop_id = ?", shopID).Updates(map[string]interface{}{ "code": req.Code, "name": req.Name, "remark": req.Remark, }) util.RespondSuccess(c, item) } func (h *ProductAttrHandler) DeleteShelfLife(c *gin.Context) { shopID := middleware.GetShopID(c) h.db.Where("id = ? AND shop_id = ?", c.Param("id"), shopID).Delete(&model.ProductShelfLifeOption{}) c.JSON(http.StatusOK, gin.H{"message": "deleted"}) } // ── 储存方式(storages) ────────────────────────────────────────── func (h *ProductAttrHandler) ListStorages(c *gin.Context) { shopID := middleware.GetShopID(c) items := make([]model.ProductStorageOption, 0) h.db.Where("shop_id = ?", shopID).Order("id ASC").Find(&items) util.RespondSuccess(c, items) } func (h *ProductAttrHandler) CreateStorage(c *gin.Context) { shopID := middleware.GetShopID(c) var req struct { Code string `json:"code"` Name string `json:"name" binding:"required"` Remark string `json:"remark"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } item := model.ProductStorageOption{ TenantBase: model.TenantBase{ShopID: shopID}, Code: req.Code, Name: req.Name, Remark: req.Remark, } if err := h.db.Create(&item).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } util.RespondCreated(c, item) } func (h *ProductAttrHandler) UpdateStorage(c *gin.Context) { shopID := middleware.GetShopID(c) var req struct { Code string `json:"code"` Name string `json:"name" binding:"required"` Remark string `json:"remark"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var item model.ProductStorageOption if err := h.db.Where("id = ? AND shop_id = ?", c.Param("id"), shopID).First(&item).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "not found"}) return } h.db.Model(&item).Where("shop_id = ?", shopID).Updates(map[string]interface{}{ "code": req.Code, "name": req.Name, "remark": req.Remark, }) util.RespondSuccess(c, item) } func (h *ProductAttrHandler) DeleteStorage(c *gin.Context) { shopID := middleware.GetShopID(c) h.db.Where("id = ? AND shop_id = ?", c.Param("id"), shopID).Delete(&model.ProductStorageOption{}) c.JSON(http.StatusOK, gin.H{"message": "deleted"}) } // ── 描述文档(description-docs) ───────────────────────────────── func (h *ProductAttrHandler) ListDescriptionDocs(c *gin.Context) { shopID := middleware.GetShopID(c) items := make([]model.ProductDescriptionDoc, 0) h.db.Where("shop_id = ?", shopID).Order("id ASC").Find(&items) util.RespondSuccess(c, items) } func (h *ProductAttrHandler) CreateDescriptionDoc(c *gin.Context) { shopID := middleware.GetShopID(c) var req struct { Title string `json:"title" binding:"required"` Content string `json:"content"` Remark string `json:"remark"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } item := model.ProductDescriptionDoc{ TenantBase: model.TenantBase{ShopID: shopID}, Title: req.Title, Content: req.Content, Remark: req.Remark, } if err := h.db.Create(&item).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } util.RespondCreated(c, item) } func (h *ProductAttrHandler) UpdateDescriptionDoc(c *gin.Context) { shopID := middleware.GetShopID(c) var req struct { Title string `json:"title" binding:"required"` Content string `json:"content"` Remark string `json:"remark"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var item model.ProductDescriptionDoc if err := h.db.Where("id = ? AND shop_id = ?", c.Param("id"), shopID).First(&item).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "not found"}) return } h.db.Model(&item).Where("shop_id = ?", shopID).Updates(map[string]interface{}{ "title": req.Title, "content": req.Content, "remark": req.Remark, }) util.RespondSuccess(c, item) } func (h *ProductAttrHandler) DeleteDescriptionDoc(c *gin.Context) { shopID := middleware.GetShopID(c) h.db.Where("id = ? AND shop_id = ?", c.Param("id"), shopID).Delete(&model.ProductDescriptionDoc{}) c.JSON(http.StatusOK, gin.H{"message": "deleted"}) }