package handler import ( "net/http" "github.com/gin-gonic/gin" "kefu-cloud/server/internal/middleware" "kefu-cloud/server/internal/service" ) type SettingsHandler struct{} func NewSettingsHandler() *SettingsHandler { return &SettingsHandler{} } func (h *SettingsHandler) Get(c *gin.Context) { tenantID := middleware.GetTenantID(c) if tenantID == 0 { c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "仅租户账号可查看设置"}) return } setting, err := service.GetOrCreateTenantSettings(tenantID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"code": 500, "message": "加载设置失败"}) return } middleware.JSON(c, service.SettingsResponse(setting)) } func (h *SettingsHandler) Update(c *gin.Context) { if !middleware.HasPermission(c, "settings.basic") { c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "仅租户管理员可修改设置"}) return } tenantID := middleware.GetTenantID(c) if tenantID == 0 { c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "仅租户账号可修改设置"}) return } if _, err := service.GetOrCreateTenantSettings(tenantID); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"code": 500, "message": "加载设置失败"}) return } var req service.SettingsUpdateReq if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误"}) return } // 设置权限按字段分区校验,避免仅拥有基本设置权限即可修改分配、工作时间或通知策略。 if req.TouchesAssignRule() && !middleware.HasPermission(c, "settings.assign_rule") { c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "无权修改客服分配规则"}) return } if req.TouchesAutoReply() && !middleware.HasPermission(c, "settings.auto_reply") { c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "无权修改自动回复设置"}) return } if req.TouchesWorktime() && !middleware.HasPermission(c, "settings.worktime") { c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "无权修改工作时间设置"}) return } if req.TouchesNotification() && !middleware.HasPermission(c, "settings.notification") { c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "无权修改通知设置"}) return } resp, err := service.UpdateTenantSettings(tenantID, &req) if err != nil { respondServiceError(c, err) return } middleware.JSON(c, resp) }