Some checks failed
CI / Build & Test (push) Failing after 33s
- 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 编译错误
190 lines
6.0 KiB
Go
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"})
|
|
}
|