mirror of https://github.com/cloudreve/Cloudreve
91 lines
2.9 KiB
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
|
|
}
|