137 lines
3.3 KiB
Go
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
|
|
}
|