package handler import ( "errors" "net/http" "strings" "github.com/freefire/jiang13-bbs/realtime" "github.com/freefire/jiang13-bbs/service" "github.com/gin-gonic/gin" ) // PublicSettings 公开站点设置(无需登录):前端 SSR 据此注入主题 CSS 变量等 // GET /api/settings func (h *Handlers) PublicSettings(c *gin.Context) { accent, err := h.Setting.AccentColor() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "获取站点设置失败"}) return } trust, err := h.Setting.TrustReviewedPublish() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "获取站点设置失败"}) return } c.JSON(http.StatusOK, gin.H{ "accent": accent, "trust_reviewed_publish": trust, }) } // updateSettingsRequest 字段均为可选指针:只更新请求里出现的项,避免外观页覆盖审核策略 type updateSettingsRequest struct { // Accent 主题色 #RRGGBB;空串恢复默认 Accent *string `json:"accent"` // TrustReviewedPublish 已过审用户后续内容免审 TrustReviewedPublish *bool `json:"trust_reviewed_publish"` } // UpdateSettings 更新站点设置(管理员) // PUT /api/admin/settings func (h *Handlers) UpdateSettings(c *gin.Context) { var req updateSettingsRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数无效"}) return } if req.Accent == nil && req.TrustReviewedPublish == nil { c.JSON(http.StatusBadRequest, gin.H{"error": "未提供任何可更新的设置项"}) return } savedAccent := "" if req.Accent != nil { if err := h.Setting.SetAccent(*req.Accent); err != nil { if errors.Is(err, service.ErrInvalidAccent) { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusInternalServerError, gin.H{"error": "保存站点设置失败"}) return } savedAccent = strings.ToLower(strings.TrimSpace(*req.Accent)) } else { var err error savedAccent, err = h.Setting.AccentColor() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "获取站点设置失败"}) return } } trustOn := true if req.TrustReviewedPublish != nil { if err := h.Setting.SetTrustReviewedPublish(*req.TrustReviewedPublish); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "保存站点设置失败"}) return } trustOn = *req.TrustReviewedPublish } else { var err error trustOn, err = h.Setting.TrustReviewedPublish() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "获取站点设置失败"}) return } } // 归一化后广播:主题色客户端热换肤;免审开关由下次发帖/发评读库生效 h.Hub.BroadcastAll(realtime.Envelope{ Type: realtime.EventSettingsChanged, Data: gin.H{ "accent": savedAccent, "trust_reviewed_publish": trustOn, }, }) c.JSON(http.StatusOK, gin.H{ "ok": true, "accent": savedAccent, "trust_reviewed_publish": trustOn, }) }