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