DB-backed runtime settings with global/tenant scope, key-value store, type support (string/number/bool/json), tenant-level overrides with global fallback.
109 lines
2.7 KiB
Go
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"})
|
|
}
|