fix(internal/fs): add ObjectAlreadyExists error check (#2019)

* fix(webdav/drivers):add errors check

* chore(pkg/error):add errs.IsObjectAlreadyExists function

* chore(pkg/error):rollback error change

* chore(op/makedir):add IsObjectAlreadyExists check

* fix(driver/quark_uc):add makedir response checking

* fix(op/put):add makedir error checking

* chore(op/put):fix logic error

* fix(driver/uc):fix error resp check

* chore(op/makedir):add parentPath check

* fix(op/makedir):fix some errors

* fix(op/makedir):fix logic error

* fix(drivers/cloudreve_v4): add object existence error

---------

Signed-off-by: MadDogOwner <xiaoran@xrgzs.top>
Co-authored-by: MadDogOwner <xiaoran@xrgzs.top>
This commit is contained in:
mkitsdts
2026-05-03 19:10:31 +08:00
committed by GitHub
parent bfda719e64
commit e87e028a49
6 changed files with 68 additions and 10 deletions

View File

@@ -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 {

View File

@@ -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,
}
}

View File

@@ -33,6 +33,7 @@ const (
CodeLoginRequired = http.StatusUnauthorized
CodePathNotExist = 40016 // Path not exist
CodeCredentialInvalid = 40020 // Failed to issue token
CodeObjectExisted = 40004 // Object existed
// IncorrectSharePassword = 40069 // Incorrect share password
)
@@ -107,6 +108,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)
}

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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)