- handler 只保留请求绑定、权限检查与响应映射;业务校验顺序、状态码与文案逐字保留 - 新增 service.Error 语义错误,由 handler 统一映射 HTTP 响应 - session 875→361 行、widget 745→321 行、settings 540→73 行 - 自动分配/租户设置(工作时间、欢迎语)/消息校验/黑名单检查/联系方式提取随迁 service 包 - 相关单元测试随迁 service 包,go test ./... 全部通过
74 lines
2.4 KiB
Go
74 lines
2.4 KiB
Go
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)
|
|
}
|