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"}) }