package handler import ( "net/http" "github.com/gin-gonic/gin" "gorm.io/gorm" "github.com/wangjia/jiu/backend/internal/model" ) type PublicHandler struct { db *gorm.DB } func NewPublicHandler(db *gorm.DB) *PublicHandler { return &PublicHandler{db: db} } // GetProduct GET /api/v1/public/products/:public_id (no auth) func (h *PublicHandler) GetProduct(c *gin.Context) { publicID := c.Param("public_id") var product model.Product if err := h.db.Where("public_id = ? AND deleted_at IS NULL", publicID). Preload("Images"). First(&product).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "not found"}) return } // Fetch shop public info var shop model.Shop shopData := gin.H{} if err := h.db.Where("id = ?", product.ShopID).First(&shop).Error; err == nil { shopData = gin.H{ "name": shop.Name, "code": shop.Code, "address": shop.Address, "phone": shop.Phone, "business_hours": shop.BusinessHours, } } // Fetch latest inventory batch for this product var inv model.Inventory batchData := gin.H(nil) if err := h.db.Where("product_id = ? AND quantity > 0 AND deleted_at IS NULL", product.ID). Order("created_at DESC"). First(&inv).Error; err == nil { var pdStr *string if inv.ProductionDate != nil { s := inv.ProductionDate.Time.Format("2006-01-02") pdStr = &s } batchData = gin.H{ "production_date": pdStr, "batch_no": inv.BatchNo, "in_stock_date": inv.CreatedAt.Format("2006-01-02"), } } c.JSON(http.StatusOK, gin.H{ "data": gin.H{ "id": product.ID, "name": product.Name, "series": product.Series, "spec": product.Spec, "brand": product.Brand, "unit": product.Unit, "description": product.Description, "images": product.Images, "shop": shopData, "batch": batchData, }, }) } // GetRelease GET /api/v1/public/release (no auth) func (h *PublicHandler) GetRelease(c *gin.Context) { cfg, err := loadVersionConfig() if err != nil { c.JSON(http.StatusOK, gin.H{ "version": "1.0.0", "release_notes": "", "download_urls": gin.H{"web": "https://jiu.51yanmei.com/app"}, }) return } c.JSON(http.StatusOK, gin.H{ "version": cfg.Version, "release_notes": cfg.ReleaseNotes, "download_urls": cfg.DownloadURLs, }) }