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() }