216 lines
5.6 KiB
Go
216 lines
5.6 KiB
Go
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()
|
|
}
|