diff --git a/drivers/189pc/driver.go b/drivers/189pc/driver.go index 6aa06c068..af719401d 100644 --- a/drivers/189pc/driver.go +++ b/drivers/189pc/driver.go @@ -271,29 +271,35 @@ func (y *Cloud189PC) Rename(ctx context.Context, srcObj model.Obj, newName strin queryParam["familyId"] = y.FamilyID } - var newObj model.Obj - switch f := srcObj.(type) { + switch srcObj.(type) { case *Cloud189File: fullUrl += "/renameFile.action" queryParam["fileId"] = srcObj.GetID() queryParam["destFileName"] = newName - newObj = &Cloud189File{Icon: f.Icon} // 复用预览 case *Cloud189Folder: fullUrl += "/renameFolder.action" queryParam["folderId"] = srcObj.GetID() queryParam["destFolderName"] = newName - newObj = &Cloud189Folder{} default: return nil, errs.NotSupport } - + var resp RenameResp _, err := y.request(fullUrl, method, func(req *resty.Request) { req.SetContext(ctx).SetQueryParams(queryParam) - }, nil, newObj, isFamily) + }, nil, resp, isFamily) if err != nil { + if resp.ResCode == "FileAlreadyExists" { + return nil, errs.ObjectAlreadyExists + } return nil, err } - return newObj, nil + switch f := srcObj.(type) { + case *Cloud189File: + return resp.toFile(f), nil + case *Cloud189Folder: + return resp.toFolder(), nil + } + return nil, errs.NotSupport } func (y *Cloud189PC) Copy(ctx context.Context, srcObj, dstDir model.Obj) error { diff --git a/drivers/189pc/types.go b/drivers/189pc/types.go index 32996debd..eed447e25 100644 --- a/drivers/189pc/types.go +++ b/drivers/189pc/types.go @@ -427,3 +427,41 @@ type CapacityResp struct { } `json:"familyCapacityInfo"` TotalSize uint64 `json:"totalSize"` } + +type RenameResp struct { + ResMsg string `json:"res_message"` + CreateDate Time `json:"createDate"` + FileCate int `json:"fileCata"` + ID string `json:"id"` + LastOpTime Time `json:"lastOpTime"` + MD5 string `json:"md5"` + MediaType int `json:"mediaType"` + Name string `json:"name"` + Oeientation int `json:"orientation"` + ParentID int64 `json:"parentId"` + Rev string `json:"rev"` + Size int64 `json:"size"` + ResCode string `json:"res_code"` +} + +func (r *RenameResp) toFile(f *Cloud189File) *Cloud189File { + return &Cloud189File{ + ID: String(r.ID), + Name: r.Name, + Size: r.Size, + Md5: r.MD5, + LastOpTime: r.LastOpTime, + CreateDate: r.CreateDate, + Icon: f.Icon, + } +} + +func (r *RenameResp) toFolder() *Cloud189Folder { + return &Cloud189Folder{ + ID: String(r.ID), + Name: r.Name, + ParentID: r.ParentID, + LastOpTime: r.LastOpTime, + CreateDate: r.CreateDate, + } +} diff --git a/drivers/cloudreve_v4/util.go b/drivers/cloudreve_v4/util.go index f8fe5f269..e22938daf 100644 --- a/drivers/cloudreve_v4/util.go +++ b/drivers/cloudreve_v4/util.go @@ -33,6 +33,7 @@ const ( CodeLoginRequired = http.StatusUnauthorized CodePathNotExist = 40016 // Path not exist CodeCredentialInvalid = 40020 // Failed to issue token + CodeObjectExisted = 40004 // Object existed ) var ( @@ -106,6 +107,9 @@ func (d *CloudreveV4) _request(method string, path string, callback base.ReqCall if r.Code == CodePathNotExist { return errs.ObjectNotFound } + if r.Code == CodeObjectExisted { + return errs.ObjectAlreadyExists + } return fmt.Errorf("%d: %s", r.Code, r.Msg) } diff --git a/drivers/quark_uc/driver.go b/drivers/quark_uc/driver.go index a1371243c..84ab24c1f 100644 --- a/drivers/quark_uc/driver.go +++ b/drivers/quark_uc/driver.go @@ -80,9 +80,12 @@ func (d *QuarkOrUC) MakeDir(ctx context.Context, parentDir model.Obj, dirName st _, err := d.request("/file", http.MethodPost, func(req *resty.Request) { req.SetBody(data) }, nil) - if err == nil { + if err == nil || err.Error() == "file is doloading[同名冲突]" { time.Sleep(time.Second) } + if err != nil && err.Error() == "file is doloading[同名冲突]" { + return errs.ObjectAlreadyExists + } return err } diff --git a/internal/errs/object.go b/internal/errs/object.go index ab78f314a..6f4befb2e 100644 --- a/internal/errs/object.go +++ b/internal/errs/object.go @@ -17,3 +17,7 @@ var ( func IsObjectNotFound(err error) bool { return errors.Is(pkgerr.Cause(err), ObjectNotFound) } + +func IsObjectAlreadyExists(err error) bool { + return errors.Is(pkgerr.Cause(err), ObjectAlreadyExists) +} diff --git a/internal/op/fs.go b/internal/op/fs.go index 5116bbef5..ab1128be1 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -330,6 +330,9 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error { if err != nil { return nil, errors.WithMessagef(err, "failed to get parent dir [%s]", parentPath) } + if !parentDir.IsDir() { + return nil, errs.NotFolder + } if model.ObjHasMask(parentDir, model.NoWrite) { return nil, errors.WithStack(errs.PermissionDenied) } @@ -343,7 +346,7 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error { default: return nil, errs.NotImplement } - if err != nil { + if err != nil && !errs.IsObjectAlreadyExists(err) { return nil, errors.WithStack(err) } if storage.Config().NoCache { @@ -640,7 +643,7 @@ func Put(ctx context.Context, storage driver.Driver, dstDirPath string, file mod } } err = MakeDir(ctx, storage, dstDirPath) - if err != nil { + if err != nil && !errs.IsObjectAlreadyExists(err) { return errors.WithMessagef(err, "failed to make dir [%s]", dstDirPath) } parentDir, err := GetUnwrap(ctx, storage, dstDirPath)