Spaces:
Paused
Paused
| 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 | |
| } | |