Files
yunzerwebsiteallinone/go/controllers/backend_notify_config.go
T

137 lines
3.3 KiB
Go

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
}