From ab216ed170878c608b3c3d3ed1a35a5b248e3912 Mon Sep 17 00:00:00 2001 From: Andy Hsu Date: Sun, 17 Dec 2023 22:58:26 +0800 Subject: [PATCH] fix(onedrive): rename object in root folder (close #5468) --- drivers/onedrive/driver.go | 39 ++++++++++++++++++++++++++++ drivers/onedrive_app/driver.go | 39 ++++++++++++++++++++++++++++ internal/op/fs.go | 46 ++++++++++++++++++---------------- 3 files changed, 102 insertions(+), 22 deletions(-) diff --git a/drivers/onedrive/driver.go b/drivers/onedrive/driver.go index 50e129d99c5..319fd906b7d 100644 --- a/drivers/onedrive/driver.go +++ b/drivers/onedrive/driver.go @@ -6,6 +6,7 @@ import ( "net/http" "net/url" "path" + "sync" "github.com/alist-org/alist/v3/drivers/base" "github.com/alist-org/alist/v3/internal/driver" @@ -19,6 +20,8 @@ type Onedrive struct { model.Storage Addition AccessToken string + root *Object + mutex sync.Mutex } func (d *Onedrive) Config() driver.Config { @@ -40,6 +43,42 @@ func (d *Onedrive) Drop(ctx context.Context) error { return nil } +func (d *Onedrive) GetRoot(ctx context.Context) (model.Obj, error) { + if d.root != nil { + return d.root, nil + } + d.mutex.Lock() + defer d.mutex.Unlock() + root := &Object{ + ObjThumb: model.ObjThumb{ + Object: model.Object{ + ID: "root", + Path: d.RootFolderPath, + Name: "root", + Size: 0, + Modified: d.Modified, + Ctime: d.Modified, + IsFolder: true, + }, + }, + ParentID: "", + } + if !utils.PathEqual(d.RootFolderPath, "/") { + // get root folder id + url := d.GetMetaUrl(false, d.RootFolderPath) + var resp struct { + Id string `json:"id"` + } + _, err := d.Request(url, http.MethodGet, nil, &resp) + if err != nil { + return nil, err + } + root.ID = resp.Id + } + d.root = root + return d.root, nil +} + func (d *Onedrive) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) { files, err := d.getFiles(dir.GetPath()) if err != nil { diff --git a/drivers/onedrive_app/driver.go b/drivers/onedrive_app/driver.go index 84ff878a4d2..8a924341bb7 100644 --- a/drivers/onedrive_app/driver.go +++ b/drivers/onedrive_app/driver.go @@ -6,6 +6,7 @@ import ( "net/http" "net/url" "path" + "sync" "github.com/alist-org/alist/v3/drivers/base" "github.com/alist-org/alist/v3/internal/driver" @@ -19,6 +20,8 @@ type OnedriveAPP struct { model.Storage Addition AccessToken string + root *Object + mutex sync.Mutex } func (d *OnedriveAPP) Config() driver.Config { @@ -40,6 +43,42 @@ func (d *OnedriveAPP) Drop(ctx context.Context) error { return nil } +func (d *OnedriveAPP) GetRoot(ctx context.Context) (model.Obj, error) { + if d.root != nil { + return d.root, nil + } + d.mutex.Lock() + defer d.mutex.Unlock() + root := &Object{ + ObjThumb: model.ObjThumb{ + Object: model.Object{ + ID: "root", + Path: d.RootFolderPath, + Name: "root", + Size: 0, + Modified: d.Modified, + Ctime: d.Modified, + IsFolder: true, + }, + }, + ParentID: "", + } + if !utils.PathEqual(d.RootFolderPath, "/") { + // get root folder id + url := d.GetMetaUrl(false, d.RootFolderPath) + var resp struct { + Id string `json:"id"` + } + _, err := d.Request(url, http.MethodGet, nil, &resp) + if err != nil { + return nil, err + } + root.ID = resp.Id + } + d.root = root + return d.root, nil +} + func (d *OnedriveAPP) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) { files, err := d.getFiles(dir.GetPath()) if err != nil { diff --git a/internal/op/fs.go b/internal/op/fs.go index 9fe7d5e6a3f..4f0cbbdd3ae 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -177,30 +177,32 @@ func Get(ctx context.Context, storage driver.Driver, path string) (model.Obj, er // is root folder if utils.PathEqual(path, "/") { var rootObj model.Obj - switch r := storage.GetAddition().(type) { - case driver.IRootId: - rootObj = &model.Object{ - ID: r.GetRootId(), - Name: RootName, - Size: 0, - Modified: storage.GetStorage().Modified, - IsFolder: true, - } - case driver.IRootPath: - rootObj = &model.Object{ - Path: r.GetRootPath(), - Name: RootName, - Size: 0, - Modified: storage.GetStorage().Modified, - IsFolder: true, + if getRooter, ok := storage.(driver.GetRooter); ok { + obj, err := getRooter.GetRoot(ctx) + if err != nil { + return nil, errors.WithMessage(err, "failed get root obj") } - default: - if storage, ok := storage.(driver.GetRooter); ok { - obj, err := storage.GetRoot(ctx) - if err != nil { - return nil, errors.WithMessage(err, "failed get root obj") + rootObj = obj + } else { + switch r := storage.GetAddition().(type) { + case driver.IRootId: + rootObj = &model.Object{ + ID: r.GetRootId(), + Name: RootName, + Size: 0, + Modified: storage.GetStorage().Modified, + IsFolder: true, + } + case driver.IRootPath: + rootObj = &model.Object{ + Path: r.GetRootPath(), + Name: RootName, + Size: 0, + Modified: storage.GetStorage().Modified, + IsFolder: true, } - rootObj = obj + default: + return nil, errors.Errorf("please implement IRootPath or IRootId or GetRooter method") } } if rootObj == nil {