| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // ============================================================================
- // memos_service.go — Memos 速记
- //
- // 通过 Memos 的 REST API 新建备忘:POST {地址}/api/memos,请求头带
- // Authorization: Bearer <访问令牌>,body 为 {"content": "...", "visibility": "..."}。
- // 地址、访问令牌与默认可见性保存在「设置 → 工具」中。
- // ============================================================================
- package main
- import (
- "bytes"
- "encoding/json"
- "errors"
- "fmt"
- "io"
- "net/http"
- "strings"
- "time"
- )
- // MemosConfig 保存 Memos 速记所需的配置。
- type MemosConfig struct {
- URL string `json:"url"` // 实例地址,如 https://m.scwy.net
- Token string `json:"token"` // 个人访问令牌(PAT),只存本地
- }
- // MemosService 提供 Memos 速记的配置读取与新建备忘接口。
- type MemosService struct{}
- // NewMemosService 创建 Memos 服务实例。
- func NewMemosService() *MemosService { return &MemosService{} }
- // GetConfig 返回当前 Memos 配置(供前端回填设置表单)。
- func (s *MemosService) GetConfig() MemosConfig {
- return loadSettings().Memos
- }
- // CreateMemo 调用 Memos REST API 新建一条私有备忘,返回备忘名称(形如 memos/xxxx)。
- func (s *MemosService) CreateMemo(content string) (string, error) {
- content = strings.TrimSpace(content)
- if content == "" {
- return "", errors.New("内容不能为空")
- }
- cfg := loadSettings().Memos
- base := strings.TrimRight(strings.TrimSpace(cfg.URL), "/")
- if base == "" {
- return "", errors.New("未配置 Memos 地址,请到「设置 → 工具」中填写")
- }
- token := strings.TrimSpace(cfg.Token)
- if token == "" {
- return "", errors.New("未配置访问令牌,请到「设置 → 工具」中填写")
- }
- // 固定创建私有备忘
- payload, err := json.Marshal(map[string]string{
- "content": content,
- "visibility": "PRIVATE",
- })
- if err != nil {
- return "", err
- }
- req, err := http.NewRequest(http.MethodPost, base+"/api/memos", bytes.NewReader(payload))
- if err != nil {
- return "", fmt.Errorf("地址无效:%w", err)
- }
- req.Header.Set("Authorization", "Bearer "+token)
- req.Header.Set("Content-Type", "application/json")
- client := &http.Client{Timeout: 20 * time.Second}
- resp, err := client.Do(req)
- if err != nil {
- return "", fmt.Errorf("请求失败:%w", err)
- }
- defer resp.Body.Close()
- body, _ := io.ReadAll(io.LimitReader(resp.Body, 4096))
- if resp.StatusCode < 200 || resp.StatusCode >= 300 {
- return "", fmt.Errorf("创建失败(HTTP %d):%s", resp.StatusCode, strings.TrimSpace(string(body)))
- }
- var out struct {
- Name string `json:"name"`
- }
- if json.Unmarshal(body, &out) == nil && out.Name != "" {
- return out.Name, nil
- }
- return "已创建", nil
- }
|