Files
rill/internal/site/site.go
T
kevin 84768e94ed Swagger 文档改为按权限分组
- @Tags 由功能维度改为 public/user/admin 权限维度
- main.go 增加全局 tag 声明与权限说明(需放在 @securitydefinitions 之前,否则会被解析器吞掉)
- 重新生成 docs/,公开 4 个、需登录 7 个、管理员 11 个接口
2026-09-21 16:24:19 +08:00

97 lines
3.2 KiB
Go

// Package site 提供站点信息(站名、Logo、页脚文案)的读取与管理员更新接口。
package site
import (
"errors"
"net/http"
"strings"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"rill/internal/httpx"
"rill/internal/model"
)
// UpdateRequest 更新站点信息请求,空 logo/footer 表示回退前端默认展示。
type UpdateRequest struct {
SiteName string `json:"site_name" binding:"required,max=100" example:"Rill"`
Logo string `json:"logo" binding:"omitempty,max=500" example:"https://example.com/logo.png"`
Footer string `json:"footer" binding:"omitempty,max=1000" example:"Copyright © Rill"`
}
// @Summary Get site settings
// @Description Public site settings: site name, logo URL, and footer text. Returns built-in defaults when the settings row is missing.
// @Tags public
// @Produce json
// @Success 200 {object} model.SiteSetting
// @Failure 500 {object} httpx.ErrorResponse
// @Router /site [get]
func Get(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
ctx := c.Request.Context()
var setting model.SiteSetting
if err := db.WithContext(ctx).First(&setting, model.SiteSettingID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
c.JSON(http.StatusOK, defaultSetting())
return
}
httpx.RespondDBError(c, err)
return
}
c.JSON(http.StatusOK, setting)
}
}
// @Summary Update site settings
// @Description Admin only. Update the site name, logo URL, and footer text; returns the updated settings.
// @Tags admin
// @Accept json
// @Produce json
// @Param site body site.UpdateRequest true "Site settings"
// @Success 200 {object} model.SiteSetting
// @Failure 400 {object} httpx.ErrorResponse "invalid request"
// @Security BearerAuth
// @Failure 401 {object} httpx.ErrorResponse "unauthorized or session expired"
// @Failure 403 {object} httpx.ErrorResponse "admin permission required or account disabled"
// @Failure 500 {object} httpx.ErrorResponse
// @Router /site [put]
func Update(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
var req UpdateRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, httpx.ErrorResponse{Error: "invalid request: " + err.Error()})
return
}
req.SiteName = strings.TrimSpace(req.SiteName)
if req.SiteName == "" {
c.JSON(http.StatusBadRequest, httpx.ErrorResponse{Error: "invalid request: site_name is required"})
return
}
ctx := c.Request.Context()
var setting model.SiteSetting
if err := db.WithContext(ctx).First(&setting, model.SiteSettingID).Error; err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) {
httpx.RespondDBError(c, err)
return
}
setting = defaultSetting()
}
setting.SiteName = req.SiteName
setting.Logo = req.Logo
setting.Footer = req.Footer
if err := db.WithContext(ctx).Save(&setting).Error; err != nil {
httpx.RespondDBError(c, err)
return
}
c.JSON(http.StatusOK, setting)
}
}
// defaultSetting 设置行缺失时的内置默认值。
func defaultSetting() model.SiteSetting {
return model.SiteSetting{ID: model.SiteSettingID, SiteName: "Rill"}
}