Files
jiang13-bbs/backend/handler/setting.go
freefire f3145b24ff feat: 就地通过评审,并为已过审用户提供默认可关的免审发布
帖/评管理入口可直接通过;站点默认信任已有 published 内容的用户后续直发。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-16 05:37:57 +08:00

103 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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,
})
}