增加bark配置

This commit is contained in:
2026-06-17 23:49:19 +08:00
parent 22e0e75c35
commit 6ee1f26124
19 changed files with 784 additions and 260 deletions
+215
View File
@@ -0,0 +1,215 @@
package controllers
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
"time"
"server/models"
"server/pkg/jwtutil"
beego "github.com/beego/beego/v2/server/web"
)
type PlatformBarkController struct {
beego.Controller
}
func (c *PlatformBarkController) platformClaims() (*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 != "platform" {
return nil, fmt.Errorf("无权访问")
}
return claims, nil
}
func (c *PlatformBarkController) jsonErr(httpStatus, bizCode int, msg string) {
c.Ctx.Output.SetStatus(httpStatus)
c.Data["json"] = map[string]interface{}{"code": bizCode, "msg": msg}
_ = c.ServeJSON()
}
// GetBarkInfo GET /platform/bark/info
func (c *PlatformBarkController) GetBarkInfo() {
if _, err := c.platformClaims(); err != nil {
c.jsonErr(401, 401, err.Error())
return
}
enabledStr := models.GetPlatformSettingValue("bark_enabled", "0")
serverURL := models.GetPlatformSettingValue("bark_server_url", "https://api.day.app")
deviceKey := models.GetPlatformSettingValue("bark_device_key", "")
enabled := false
if enabledStr == "1" {
enabled = true
}
c.Data["json"] = map[string]interface{}{
"code": 200,
"msg": "success",
"data": map[string]interface{}{
"enabled": enabled,
"server_url": serverURL,
"device_key": deviceKey,
},
}
_ = c.ServeJSON()
}
type barkEditPayload struct {
Enabled bool `json:"enabled"`
ServerUrl string `json:"server_url"`
DeviceKey string `json:"device_key"`
}
// EditBarkInfo POST /platform/bark/editinfo
func (c *PlatformBarkController) EditBarkInfo() {
if _, err := c.platformClaims(); err != nil {
c.jsonErr(401, 401, err.Error())
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
var p barkEditPayload
if err := json.Unmarshal(raw, &p); err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
enabledStr := "0"
if p.Enabled {
enabledStr = "1"
}
serverURL := strings.TrimSpace(p.ServerUrl)
if serverURL == "" {
serverURL = "https://api.day.app"
}
deviceKey := strings.TrimSpace(p.DeviceKey)
settings := []struct {
code string
name string
value string
remark string
}{
{"bark_enabled", "Bark推送启用状态", enabledStr, "0为关闭,1为开启"},
{"bark_server_url", "Bark推送服务器地址", serverURL, ""},
{"bark_device_key", "Bark设备Key", deviceKey, ""},
}
for _, item := range settings {
var setting models.PlatformNormalSetting
err := models.Orm.QueryTable(new(models.PlatformNormalSetting)).
Filter("code", item.code).
Filter("delete_time__isnull", true).
One(&setting)
if err == nil {
setting.Value = item.value
setting.Name = item.name
setting.Remark = item.remark
now := time.Now()
setting.UpdateTime = &now
_, err = models.Orm.Update(&setting, "Value", "Name", "Remark", "UpdateTime")
if err != nil {
c.jsonErr(500, 500, "保存失败: "+err.Error())
return
}
} else {
newSetting := models.PlatformNormalSetting{
Name: item.name,
Code: item.code,
Value: item.value,
Remark: item.remark,
CreateTime: time.Now(),
}
_, err = models.Orm.Insert(&newSetting)
if err != nil {
c.jsonErr(500, 500, "保存失败: "+err.Error())
return
}
}
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "保存成功"}
_ = c.ServeJSON()
}
type barkTestPayload struct {
ServerUrl string `json:"server_url"`
DeviceKey string `json:"device_key"`
}
// SendTestBark POST /platform/bark/sendtest
func (c *PlatformBarkController) SendTestBark() {
if _, err := c.platformClaims(); err != nil {
c.jsonErr(401, 401, err.Error())
return
}
raw, err := io.ReadAll(c.Ctx.Request.Body)
if err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
var p barkTestPayload
if err := json.Unmarshal(raw, &p); err != nil {
c.jsonErr(400, 400, "参数错误")
return
}
serverURL := strings.TrimSpace(p.ServerUrl)
if serverURL == "" {
serverURL = models.GetPlatformSettingValue("bark_server_url", "https://api.day.app")
}
deviceKey := strings.TrimSpace(p.DeviceKey)
if deviceKey == "" {
deviceKey = models.GetPlatformSettingValue("bark_device_key", "")
}
if deviceKey == "" {
c.jsonErr(400, 400, "设备 Key 不能为空")
return
}
// 拼接发送 URL,注意去除多余斜杠
baseURL := strings.TrimRight(serverURL, "/")
// Bark 的格式是: base_url/device_key/title/body
testURL := fmt.Sprintf("%s/%s/测试通知/您配置的 Bark 推送服务已连接成功!", baseURL, deviceKey)
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Get(testURL)
if err != nil {
c.jsonErr(500, 500, "发送失败: "+err.Error())
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
bodyBytes, _ := io.ReadAll(resp.Body)
c.jsonErr(500, 500, fmt.Sprintf("发送失败,HTTP 状态码: %d, 返回内容: %s", resp.StatusCode, string(bodyBytes)))
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "测试推送已发出,请注意查收"}
_ = c.ServeJSON()
}