Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions drivers/189pc/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
38 changes: 38 additions & 0 deletions drivers/189pc/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
}
4 changes: 4 additions & 0 deletions drivers/cloudreve_v4/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ const (
CodeLoginRequired = http.StatusUnauthorized
CodePathNotExist = 40016 // Path not exist
CodeCredentialInvalid = 40020 // Failed to issue token
CodeObjectExisted = 40004 // Object existed
)

var (
Expand Down Expand Up @@ -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)
}

Expand Down
5 changes: 4 additions & 1 deletion drivers/quark_uc/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
4 changes: 4 additions & 0 deletions internal/errs/object.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
7 changes: 5 additions & 2 deletions internal/op/fs.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand All @@ -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 {
Expand Down Expand Up @@ -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)
Expand Down