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