mirror of https://github.com/Xhofe/alist
67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
package lark
|
|
|
|
import (
|
|
"context"
|
|
"github.com/Xhofe/go-cache"
|
|
larkdrive "github.com/larksuite/oapi-sdk-go/v3/service/drive/v1"
|
|
log "github.com/sirupsen/logrus"
|
|
"path"
|
|
"time"
|
|
)
|
|
|
|
const objTokenCacheDuration = 5 * time.Minute
|
|
const emptyFolderToken = "empty"
|
|
|
|
var objTokenCache = cache.NewMemCache[string]()
|
|
var exOpts = cache.WithEx[string](objTokenCacheDuration)
|
|
|
|
func (c *Lark) getObjToken(ctx context.Context, folderPath string) (string, bool) {
|
|
if token, ok := objTokenCache.Get(folderPath); ok {
|
|
return token, true
|
|
}
|
|
|
|
dir, name := path.Split(folderPath)
|
|
// strip the last slash of dir if it exists
|
|
if len(dir) > 0 && dir[len(dir)-1] == '/' {
|
|
dir = dir[:len(dir)-1]
|
|
}
|
|
if name == "" {
|
|
return c.rootFolderToken, true
|
|
}
|
|
|
|
var parentToken string
|
|
var found bool
|
|
parentToken, found = c.getObjToken(ctx, dir)
|
|
if !found {
|
|
return emptyFolderToken, false
|
|
}
|
|
|
|
req := larkdrive.NewListFileReqBuilder().FolderToken(parentToken).Build()
|
|
resp, err := c.client.Drive.File.ListByIterator(ctx, req)
|
|
|
|
if err != nil {
|
|
log.WithError(err).Error("failed to list files")
|
|
return emptyFolderToken, false
|
|
}
|
|
|
|
var file *larkdrive.File
|
|
for {
|
|
found, file, err = resp.Next()
|
|
if !found {
|
|
break
|
|
}
|
|
|
|
if err != nil {
|
|
log.WithError(err).Error("failed to get next file")
|
|
break
|
|
}
|
|
|
|
if *file.Name == name {
|
|
objTokenCache.Set(folderPath, *file.Token, exOpts)
|
|
return *file.Token, true
|
|
}
|
|
}
|
|
|
|
return emptyFolderToken, false
|
|
}
|