package controllers import ( "encoding/json" "fmt" "io" "strings" "time" "server/models" "server/pkg/jwtutil" beego "github.com/beego/beego/v2/server/web" ) // BackendNotifyConfigController 租户用户通知配置控制器 type BackendNotifyConfigController struct { beego.Controller } func (c *BackendNotifyConfigController) ncClaims() (*jwtutil.Claims, error) { auth := c.Ctx.Request.Header.Get("Authorization") if auth == "" { return nil, fmt.Errorf("未登录") } parts := strings.SplitN(auth, " ", 2) if len(parts) != 2 || parts[0] != "Bearer" { return nil, fmt.Errorf("认证信息格式错误") } claims, err := jwtutil.ParseToken(parts[1]) if err != nil { return nil, fmt.Errorf("无效的token") } if claims.UserType != "backend" { return nil, fmt.Errorf("无权访问") } return claims, nil } func (c *BackendNotifyConfigController) ncJsonErr(httpStatus, bizCode int, msg string) { c.Ctx.Output.SetStatus(httpStatus) c.Data["json"] = map[string]interface{}{"code": bizCode, "msg": msg} _ = c.ServeJSON() } func (c *BackendNotifyConfigController) ncOk(data interface{}) { c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success", "data": data} _ = c.ServeJSON() } type notifyConfigPayload struct { Email string `json:"email"` Phone string `json:"phone"` BarkDeviceKey string `json:"bark_device_key"` BarkServerURL string `json:"bark_server_url"` } // GetConfig GET /backend/notify-config // 获取当前登录用户的通知配置 func (c *BackendNotifyConfigController) GetConfig() { claims, err := c.ncClaims() if err != nil { c.ncJsonErr(401, 401, err.Error()) return } cfg := models.GetBackendUserNotifyConfig(uint64(claims.TenantId), uint64(claims.UserID)) if cfg == nil { // 未配置时返回空结构,前端可以直接展示空表单 cfg = &models.BackendUserNotifyConfig{} } c.ncOk(cfg) } // UpdateConfig PUT /backend/notify-config // 更新当前登录用户的通知配置(不存在则创建) func (c *BackendNotifyConfigController) UpdateConfig() { claims, err := c.ncClaims() if err != nil { c.ncJsonErr(401, 401, err.Error()) return } raw, err := io.ReadAll(c.Ctx.Request.Body) if err != nil { c.ncJsonErr(400, 400, "参数错误") return } var p notifyConfigPayload if err := json.Unmarshal(raw, &p); err != nil { c.ncJsonErr(400, 400, "参数错误") return } tid := uint64(claims.TenantId) uid := uint64(claims.UserID) now := time.Now() cfg := models.GetBackendUserNotifyConfig(tid, uid) if cfg == nil { cfg = &models.BackendUserNotifyConfig{ Tid: tid, UserID: uid, CreateTime: now, } } cfg.Email = ncStrPtr(p.Email) cfg.Phone = ncStrPtr(p.Phone) cfg.BarkDeviceKey = ncStrPtr(p.BarkDeviceKey) cfg.BarkServerURL = ncStrPtr(p.BarkServerURL) cfg.UpdateTime = now if cfg.ID == 0 { if _, err := models.Orm.Insert(cfg); err != nil { c.ncJsonErr(500, 500, "保存失败: "+err.Error()) return } } else { if _, err := models.Orm.Update(cfg, "Email", "Phone", "BarkDeviceKey", "BarkServerURL", "UpdateTime"); err != nil { c.ncJsonErr(500, 500, "更新失败: "+err.Error()) return } } c.ncOk(nil) } // ncStrPtr 字符串转指针,空字符串返回 nil func ncStrPtr(s string) *string { s = strings.TrimSpace(s) if s == "" { return nil } return &s }