mengstack-api/internal/modules/settings/interfaces/handler.go
MengStack Dev 0eb6a96057 feat(settings): M5 配置管理模块
DB-backed runtime settings with global/tenant scope, key-value store,
type support (string/number/bool/json), tenant-level overrides with
global fallback.
2026-10-03 01:02:53 +08:00

109 lines
2.7 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}
}
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)
}
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)
}
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)
}
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)
}
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)
}
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)
}
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"})
}