mengstack-api/internal/modules/settings/interfaces/handler.go
MengStack Dev 9148d2f6da
Some checks failed
CI / Build & Test (push) Failing after 33s
feat: Swagger 全量注解 + M8 质量加固
- 37 个端点全部添加 godoc Swagger 注解(RBAC 11 / Org 5 / Audit 1 / Settings 7 / Notification 7)
- 重新生成 docs/(swagger.json/yaml/docs.go)
- M8 质量横切:IP 限流、安全头、Body 限制、结构化日志增强、优雅关闭
- 新增 Dockerfile 多阶段构建 + .dockerignore
- 新增 testutil 测试工具包
- 修复 testutil.go 编译错误
2026-10-03 01:57:39 +08:00

190 lines
6.0 KiB
Go

package interfaces
import (
"net/http"
"mengstack/internal/kernel/response"
"mengstack/internal/modules/settings/application"
"mengstack/internal/modules/settings/domain"
"github.com/gin-gonic/gin"
)
type Handler struct {
svc *application.Service
}
func NewHandler(svc *application.Service) *Handler {
return &Handler{svc: svc}
}
// GetGlobalSetting godoc
// @Summary 获取全局配置
// @Description 根据 key 获取全局(非租户)配置项
// @Tags Settings
// @Produce json
// @Param key path string true "配置键名"
// @Success 200 {object} response.Response{data=domain.SettingDTO}
// @Failure 400 {object} response.Response
// @Failure 404 {object} response.Response
// @Security Bearer
// @Security TenantID
// @Router /api/v1/settings/global/{key} [get]
func (h *Handler) GetGlobalSetting(c *gin.Context) {
key := c.Param("key")
setting, err := h.svc.GetGlobalSetting(c.Request.Context(), key)
if err != nil {
response.HandleError(c, err)
return
}
if setting == nil {
response.Fail(c, response.NewBadRequest("setting not found"))
return
}
response.Success(c, setting)
}
// UpdateGlobalSetting godoc
// @Summary 更新全局配置
// @Description 创建或更新全局配置项
// @Tags Settings
// @Accept json
// @Produce json
// @Param key path string true "配置键名"
// @Param request body domain.UpdateSettingRequest true "配置值"
// @Success 200 {object} response.Response
// @Failure 400 {object} response.Response
// @Security Bearer
// @Security TenantID
// @Router /api/v1/settings/global/{key} [put]
func (h *Handler) UpdateGlobalSetting(c *gin.Context) {
key := c.Param("key")
var req domain.UpdateSettingRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.Fail(c, response.NewBadRequest("invalid request: "+err.Error()))
return
}
userID := c.GetUint("user_id")
if err := h.svc.UpdateGlobalSetting(c.Request.Context(), key, &req, userID); err != nil {
response.HandleError(c, err)
return
}
response.Success(c, nil)
}
// ListGlobalSettings godoc
// @Summary 列出全局配置
// @Description 获取所有全局配置项
// @Tags Settings
// @Produce json
// @Success 200 {object} response.Response{data=[]domain.SettingDTO}
// @Failure 500 {object} response.Response
// @Security Bearer
// @Security TenantID
// @Router /api/v1/settings [get]
func (h *Handler) ListGlobalSettings(c *gin.Context) {
settings, err := h.svc.ListGlobalSettings(c.Request.Context())
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, settings)
}
// GetTenantSetting godoc
// @Summary 获取租户配置
// @Description 根据 key 获取当前租户的配置项
// @Tags Settings
// @Produce json
// @Param key path string true "配置键名"
// @Success 200 {object} response.Response{data=domain.SettingDTO}
// @Failure 400 {object} response.Response
// @Failure 404 {object} response.Response
// @Security Bearer
// @Security TenantID
// @Router /api/v1/settings/tenant/{key} [get]
func (h *Handler) GetTenantSetting(c *gin.Context) {
key := c.Param("key")
tenantID := c.GetString("tenant_id")
setting, err := h.svc.GetTenantSetting(c.Request.Context(), tenantID, key)
if err != nil {
response.HandleError(c, err)
return
}
if setting == nil {
response.Fail(c, response.NewBadRequest("setting not found"))
return
}
response.Success(c, setting)
}
// UpdateTenantSetting godoc
// @Summary 更新租户配置
// @Description 创建或更新当前租户的配置项
// @Tags Settings
// @Accept json
// @Produce json
// @Param key path string true "配置键名"
// @Param request body domain.UpdateSettingRequest true "配置值"
// @Success 200 {object} response.Response
// @Failure 400 {object} response.Response
// @Security Bearer
// @Security TenantID
// @Router /api/v1/settings/tenant/{key} [put]
func (h *Handler) UpdateTenantSetting(c *gin.Context) {
key := c.Param("key")
tenantID := c.GetString("tenant_id")
var req domain.UpdateSettingRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.Fail(c, response.NewBadRequest("invalid request: "+err.Error()))
return
}
userID := c.GetUint("user_id")
if err := h.svc.UpdateTenantSetting(c.Request.Context(), tenantID, key, &req, userID); err != nil {
response.HandleError(c, err)
return
}
response.Success(c, nil)
}
// ListTenantSettings godoc
// @Summary 列出租户配置
// @Description 获取当前租户的所有配置项
// @Tags Settings
// @Produce json
// @Success 200 {object} response.Response{data=[]domain.SettingDTO}
// @Failure 500 {object} response.Response
// @Security Bearer
// @Security TenantID
// @Router /api/v1/settings/tenant [get]
func (h *Handler) ListTenantSettings(c *gin.Context) {
tenantID := c.GetString("tenant_id")
settings, err := h.svc.ListTenantSettings(c.Request.Context(), tenantID)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, settings)
}
// DeleteTenantSetting godoc
// @Summary 删除租户配置
// @Description 删除当前租户的指定配置项
// @Tags Settings
// @Param key path string true "配置键名"
// @Success 200 {object} response.Response
// @Failure 400 {object} response.Response
// @Failure 404 {object} response.Response
// @Security Bearer
// @Security TenantID
// @Router /api/v1/settings/tenant/{key} [delete]
func (h *Handler) DeleteTenantSetting(c *gin.Context) {
key := c.Param("key")
tenantID := c.GetString("tenant_id")
if err := h.svc.DeleteTenantSetting(c.Request.Context(), tenantID, key); err != nil {
response.HandleError(c, err)
return
}
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "deleted"})
}