84 lines
2.3 KiB
Go
84 lines
2.3 KiB
Go
package feishu_util
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
|
||
larkcore "github.com/larksuite/oapi-sdk-go/v3/core"
|
||
larkwiki "github.com/larksuite/oapi-sdk-go/v3/service/wiki/v2"
|
||
)
|
||
|
||
// WikiNode 知识库节点解析结果。
|
||
type WikiNode struct {
|
||
SpaceID string
|
||
NodeToken string
|
||
ObjToken string
|
||
ObjType string
|
||
Title string
|
||
}
|
||
|
||
// ResolveWikiNode 通过知识库 node_token 获取实际云文档 obj_token。
|
||
// 知识库 URL 中的 token 不是 spreadsheet_token,读写表格内容前必须先转换。
|
||
func (c *Client) ResolveWikiNode(ctx context.Context, wikiToken string) (*WikiNode, error) {
|
||
if wikiToken == "" {
|
||
return nil, fmt.Errorf("wikiToken 为空")
|
||
}
|
||
req := larkwiki.NewGetNodeSpaceReqBuilder().
|
||
Token(wikiToken).
|
||
Build()
|
||
resp, err := c.Lark.Wiki.V2.Space.GetNode(ctx, req)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("获取知识库节点失败: %w", err)
|
||
}
|
||
if !resp.Success() {
|
||
return nil, fmt.Errorf("获取知识库节点失败: code=%d msg=%s log_id=%s detail=%s",
|
||
resp.Code, resp.Msg, resp.RequestId(), larkcore.Prettify(resp.CodeError))
|
||
}
|
||
if resp.Data == nil || resp.Data.Node == nil {
|
||
return nil, fmt.Errorf("获取知识库节点返回空数据")
|
||
}
|
||
n := resp.Data.Node
|
||
node := &WikiNode{}
|
||
if n.SpaceId != nil {
|
||
node.SpaceID = *n.SpaceId
|
||
}
|
||
if n.NodeToken != nil {
|
||
node.NodeToken = *n.NodeToken
|
||
}
|
||
if n.ObjToken != nil {
|
||
node.ObjToken = *n.ObjToken
|
||
}
|
||
if n.ObjType != nil {
|
||
node.ObjType = *n.ObjType
|
||
}
|
||
if n.Title != nil {
|
||
node.Title = *n.Title
|
||
}
|
||
if node.ObjToken == "" {
|
||
return nil, fmt.Errorf("知识库节点未返回 obj_token")
|
||
}
|
||
return node, nil
|
||
}
|
||
|
||
// ResolveSpreadsheetToken 将 SpreadsheetRef 解析为可调用 Sheets API 的 spreadsheet_token。
|
||
func (c *Client) ResolveSpreadsheetToken(ctx context.Context, ref *SpreadsheetRef) (string, error) {
|
||
if ref == nil {
|
||
return "", fmt.Errorf("SpreadsheetRef 为空")
|
||
}
|
||
if ref.SpreadsheetToken != "" {
|
||
return ref.SpreadsheetToken, nil
|
||
}
|
||
if ref.WikiToken == "" {
|
||
return "", fmt.Errorf("既无 SpreadsheetToken 也无 WikiToken")
|
||
}
|
||
node, err := c.ResolveWikiNode(ctx, ref.WikiToken)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
if node.ObjType != "" && node.ObjType != "sheet" {
|
||
return "", fmt.Errorf("知识库节点类型为 %s,不是电子表格(sheet)", node.ObjType)
|
||
}
|
||
ref.SpreadsheetToken = node.ObjToken
|
||
return node.ObjToken, nil
|
||
}
|