Skip to content

Commit e87e028

Browse files
mkitsdtsxrgzs
andauthored
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>
1 parent bfda719 commit e87e028

6 files changed

Lines changed: 68 additions & 10 deletions

File tree

drivers/189pc/driver.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -271,29 +271,35 @@ func (y *Cloud189PC) Rename(ctx context.Context, srcObj model.Obj, newName strin
271271
queryParam["familyId"] = y.FamilyID
272272
}
273273

274-
var newObj model.Obj
275-
switch f := srcObj.(type) {
274+
switch srcObj.(type) {
276275
case *Cloud189File:
277276
fullUrl += "/renameFile.action"
278277
queryParam["fileId"] = srcObj.GetID()
279278
queryParam["destFileName"] = newName
280-
newObj = &Cloud189File{Icon: f.Icon} // 复用预览
281279
case *Cloud189Folder:
282280
fullUrl += "/renameFolder.action"
283281
queryParam["folderId"] = srcObj.GetID()
284282
queryParam["destFolderName"] = newName
285-
newObj = &Cloud189Folder{}
286283
default:
287284
return nil, errs.NotSupport
288285
}
289-
286+
var resp RenameResp
290287
_, err := y.request(fullUrl, method, func(req *resty.Request) {
291288
req.SetContext(ctx).SetQueryParams(queryParam)
292-
}, nil, newObj, isFamily)
289+
}, nil, resp, isFamily)
293290
if err != nil {
291+
if resp.ResCode == "FileAlreadyExists" {
292+
return nil, errs.ObjectAlreadyExists
293+
}
294294
return nil, err
295295
}
296-
return newObj, nil
296+
switch f := srcObj.(type) {
297+
case *Cloud189File:
298+
return resp.toFile(f), nil
299+
case *Cloud189Folder:
300+
return resp.toFolder(), nil
301+
}
302+
return nil, errs.NotSupport
297303
}
298304

299305
func (y *Cloud189PC) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {

drivers/189pc/types.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,3 +427,41 @@ type CapacityResp struct {
427427
} `json:"familyCapacityInfo"`
428428
TotalSize uint64 `json:"totalSize"`
429429
}
430+
431+
type RenameResp struct {
432+
ResMsg string `json:"res_message"`
433+
CreateDate Time `json:"createDate"`
434+
FileCate int `json:"fileCata"`
435+
ID string `json:"id"`
436+
LastOpTime Time `json:"lastOpTime"`
437+
MD5 string `json:"md5"`
438+
MediaType int `json:"mediaType"`
439+
Name string `json:"name"`
440+
Oeientation int `json:"orientation"`
441+
ParentID int64 `json:"parentId"`
442+
Rev string `json:"rev"`
443+
Size int64 `json:"size"`
444+
ResCode string `json:"res_code"`
445+
}
446+
447+
func (r *RenameResp) toFile(f *Cloud189File) *Cloud189File {
448+
return &Cloud189File{
449+
ID: String(r.ID),
450+
Name: r.Name,
451+
Size: r.Size,
452+
Md5: r.MD5,
453+
LastOpTime: r.LastOpTime,
454+
CreateDate: r.CreateDate,
455+
Icon: f.Icon,
456+
}
457+
}
458+
459+
func (r *RenameResp) toFolder() *Cloud189Folder {
460+
return &Cloud189Folder{
461+
ID: String(r.ID),
462+
Name: r.Name,
463+
ParentID: r.ParentID,
464+
LastOpTime: r.LastOpTime,
465+
CreateDate: r.CreateDate,
466+
}
467+
}

drivers/cloudreve_v4/util.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const (
3333
CodeLoginRequired = http.StatusUnauthorized
3434
CodePathNotExist = 40016 // Path not exist
3535
CodeCredentialInvalid = 40020 // Failed to issue token
36+
CodeObjectExisted = 40004 // Object existed
3637
// IncorrectSharePassword = 40069 // Incorrect share password
3738
)
3839

@@ -107,6 +108,9 @@ func (d *CloudreveV4) _request(method string, path string, callback base.ReqCall
107108
if r.Code == CodePathNotExist {
108109
return errs.ObjectNotFound
109110
}
111+
if r.Code == CodeObjectExisted {
112+
return errs.ObjectAlreadyExists
113+
}
110114
return fmt.Errorf("%d: %s", r.Code, r.Msg)
111115
}
112116

drivers/quark_uc/driver.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,12 @@ func (d *QuarkOrUC) MakeDir(ctx context.Context, parentDir model.Obj, dirName st
8080
_, err := d.request("/file", http.MethodPost, func(req *resty.Request) {
8181
req.SetBody(data)
8282
}, nil)
83-
if err == nil {
83+
if err == nil || err.Error() == "file is doloading[同名冲突]" {
8484
time.Sleep(time.Second)
8585
}
86+
if err != nil && err.Error() == "file is doloading[同名冲突]" {
87+
return errs.ObjectAlreadyExists
88+
}
8689
return err
8790
}
8891

internal/errs/object.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,7 @@ var (
1717
func IsObjectNotFound(err error) bool {
1818
return errors.Is(pkgerr.Cause(err), ObjectNotFound)
1919
}
20+
21+
func IsObjectAlreadyExists(err error) bool {
22+
return errors.Is(pkgerr.Cause(err), ObjectAlreadyExists)
23+
}

internal/op/fs.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,9 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error {
330330
if err != nil {
331331
return nil, errors.WithMessagef(err, "failed to get parent dir [%s]", parentPath)
332332
}
333+
if !parentDir.IsDir() {
334+
return nil, errs.NotFolder
335+
}
333336
if model.ObjHasMask(parentDir, model.NoWrite) {
334337
return nil, errors.WithStack(errs.PermissionDenied)
335338
}
@@ -343,7 +346,7 @@ func MakeDir(ctx context.Context, storage driver.Driver, path string) error {
343346
default:
344347
return nil, errs.NotImplement
345348
}
346-
if err != nil {
349+
if err != nil && !errs.IsObjectAlreadyExists(err) {
347350
return nil, errors.WithStack(err)
348351
}
349352
if storage.Config().NoCache {
@@ -640,7 +643,7 @@ func Put(ctx context.Context, storage driver.Driver, dstDirPath string, file mod
640643
}
641644
}
642645
err = MakeDir(ctx, storage, dstDirPath)
643-
if err != nil {
646+
if err != nil && !errs.IsObjectAlreadyExists(err) {
644647
return errors.WithMessagef(err, "failed to make dir [%s]", dstDirPath)
645648
}
646649
parentDir, err := GetUnwrap(ctx, storage, dstDirPath)

0 commit comments

Comments
 (0)