Cloudreve/pkg/filemanager/driver/onedrive/client.go

91 lines
2.9 KiB
Go

package onedrive
import (
"context"
"errors"
"io"
"github.com/cloudreve/Cloudreve/v4/ent"
"github.com/cloudreve/Cloudreve/v4/pkg/credmanager"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
"github.com/cloudreve/Cloudreve/v4/pkg/logging"
"github.com/cloudreve/Cloudreve/v4/pkg/setting"
"github.com/cloudreve/Cloudreve/v4/pkg/request"
)
var (
// ErrAuthEndpoint 无法解析授权端点地址
ErrAuthEndpoint = errors.New("failed to parse endpoint url")
// ErrInvalidRefreshToken 上传策略无有效的RefreshToken
ErrInvalidRefreshToken = errors.New("no valid refresh token in this policy")
// ErrDeleteFile 无法删除文件
ErrDeleteFile = errors.New("cannot delete file")
// ErrClientCanceled 客户端取消操作
ErrClientCanceled = errors.New("client canceled")
// Desired thumb size not available
ErrThumbSizeNotFound = errors.New("thumb size not found")
)
type Client interface {
ListChildren(ctx context.Context, path string) ([]FileInfo, error)
Meta(ctx context.Context, id string, path string) (*FileInfo, error)
CreateUploadSession(ctx context.Context, dst string, opts ...Option) (string, error)
GetSiteIDByURL(ctx context.Context, siteUrl string) (string, error)
GetUploadSessionStatus(ctx context.Context, uploadURL string) (*UploadSessionResponse, error)
Upload(ctx context.Context, file *fs.UploadRequest) error
SimpleUpload(ctx context.Context, dst string, body io.Reader, size int64, opts ...Option) (*UploadResult, error)
DeleteUploadSession(ctx context.Context, uploadURL string) error
BatchDelete(ctx context.Context, dst []string) ([]string, error)
GetThumbURL(ctx context.Context, dst string) (string, error)
OAuthURL(ctx context.Context, scopes []string) string
ObtainToken(ctx context.Context, opts ...Option) (*Credential, error)
}
// client OneDrive客户端
type client struct {
endpoints *endpoints
policy *ent.StoragePolicy
credential credmanager.Credential
httpClient request.Client
cred credmanager.CredManager
l logging.Logger
settings setting.Provider
chunkSize int64
}
// endpoints OneDrive客户端相关设置
type endpoints struct {
oAuthEndpoints *oauthEndpoint
endpointURL string // 接口请求的基URL
driverResource string // 要使用的驱动器
}
// NewClient 根据存储策略获取新的client
func NewClient(policy *ent.StoragePolicy, httpClient request.Client, cred credmanager.CredManager,
l logging.Logger, settings setting.Provider, chunkSize int64) Client {
client := &client{
endpoints: &endpoints{
endpointURL: policy.Server,
driverResource: policy.Settings.OdDriver,
},
policy: policy,
httpClient: httpClient,
cred: cred,
l: l,
settings: settings,
chunkSize: chunkSize,
}
if client.endpoints.driverResource == "" {
client.endpoints.driverResource = "me/drive"
}
oauthBase := getOAuthEndpoint(policy.Server)
client.endpoints.oAuthEndpoints = oauthBase
return client
}