diff --git a/server/common/common.go b/server/common/common.go index e231ffe6..33ae704e 100644 --- a/server/common/common.go +++ b/server/common/common.go @@ -68,21 +68,29 @@ func ErrorStrResp(c *gin.Context, str string, code int, l ...bool) { } func SuccessResp(c *gin.Context, data ...interface{}) { - if len(data) == 0 { - c.JSON(200, Resp[interface{}]{ - Code: 200, - Message: "success", - Data: nil, - }) - return + SuccessWithMsgResp(c, "success", data...) +} + +func SuccessWithMsgResp(c *gin.Context, msg string, data ...interface{}) { + var respData interface{} + if len(data) > 0 { + respData = data[0] } + c.JSON(200, Resp[interface{}]{ Code: 200, - Message: "success", - Data: data[0], + Message: msg, + Data: respData, }) } +func Pluralize(count int, singular, plural string) string { + if count == 1 { + return singular + } + return plural +} + func GetHttpReq(ctx context.Context) *http.Request { if c, ok := ctx.(*gin.Context); ok { return c.Request diff --git a/server/handles/const.go b/server/handles/const.go new file mode 100644 index 00000000..b108c9da --- /dev/null +++ b/server/handles/const.go @@ -0,0 +1,7 @@ +package handles + +const ( + CANCEL = "cancel" + OVERWRITE = "overwrite" + SKIP = "skip" +) diff --git a/server/handles/fsbatch.go b/server/handles/fsbatch.go index dd7b7e47..3841bff5 100644 --- a/server/handles/fsbatch.go +++ b/server/handles/fsbatch.go @@ -16,9 +16,9 @@ import ( ) type RecursiveMoveReq struct { - SrcDir string `json:"src_dir"` - DstDir string `json:"dst_dir"` - Overwrite bool `json:"overwrite"` + SrcDir string `json:"src_dir"` + DstDir string `json:"dst_dir"` + ConflictPolicy string `json:"conflict_policy"` } func FsRecursiveMove(c *gin.Context) { @@ -60,7 +60,7 @@ func FsRecursiveMove(c *gin.Context) { } var existingFileNames []string - if !req.Overwrite { + if req.ConflictPolicy != OVERWRITE { dstFiles, err := fs.List(c, dstDir, &fs.ListArgs{}) if err != nil { common.ErrorResp(c, err, 500) @@ -99,25 +99,28 @@ func FsRecursiveMove(c *gin.Context) { filePathMap[subFile] = subFilePath } } else { - if movingFilePath == dstDir { // same directory, don't move continue } - if !req.Overwrite { - if slices.Contains(existingFileNames, movingFile.GetName()) { + if slices.Contains(existingFileNames, movingFile.GetName()) { + if req.ConflictPolicy == CANCEL { common.ErrorStrResp(c, fmt.Sprintf("file [%s] exists", movingFile.GetName()), 403) return + } else if req.ConflictPolicy == SKIP { + continue } + } else if req.ConflictPolicy != OVERWRITE { existingFileNames = append(existingFileNames, movingFile.GetName()) } - movingFileNames = append(movingFileNames, movingFileName) + } } + var count = 0 for i, fileName := range movingFileNames { // move err := fs.Move(c, fileName, dstDir, len(movingFileNames) > i+1) @@ -125,9 +128,10 @@ func FsRecursiveMove(c *gin.Context) { common.ErrorResp(c, err, 500) return } + count++ } - common.SuccessResp(c) + common.SuccessWithMsgResp(c, fmt.Sprintf("Successfully moved %d %s", count, common.Pluralize(count, "file", "files"))) } type BatchRenameReq struct {