帖/评管理入口可直接通过;站点默认信任已有 published 内容的用户后续直发。 Co-authored-by: Cursor <cursoragent@cursor.com>
103 lines
3.0 KiB
Go
103 lines
3.0 KiB
Go
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,
|
||
})
|
||
}
|