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