From 8fc7c716c0b183a2660a9ab1cdec87c525491dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E5=87=89?= Date: Wed, 26 Jan 2022 14:07:51 +0800 Subject: [PATCH] :sparkles: copy api --- server/controllers/file/copy.go | 61 +++++++++++++++++++++++++++++++ server/controllers/file/move.go | 4 +- server/controllers/file/raname.go | 2 +- server/router.go | 1 + 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 server/controllers/file/copy.go diff --git a/server/controllers/file/copy.go b/server/controllers/file/copy.go new file mode 100644 index 00000000..8fc7fbb6 --- /dev/null +++ b/server/controllers/file/copy.go @@ -0,0 +1,61 @@ +package file + +import ( + "github.com/Xhofe/alist/drivers/base" + "github.com/Xhofe/alist/drivers/operate" + "github.com/Xhofe/alist/model" + "github.com/Xhofe/alist/server/common" + "github.com/Xhofe/alist/utils" + "github.com/gin-gonic/gin" +) + +func Copy(c *gin.Context) { + var req MoveCopyReq + if err := c.ShouldBind(&req); err != nil { + common.ErrorResp(c, err, 400) + return + } + if len(req.Names) == 0 { + common.ErrorStrResp(c, "Empty file names", 400) + return + } + if model.AccountsCount() > 1 && (req.SrcDir == "/" || req.DstDir == "/") { + common.ErrorStrResp(c, "Can't operate root folder", 400) + return + } + srcAccount, srcPath, srcDriver, err := common.ParsePath(utils.Join(req.SrcDir, req.Names[0])) + if err != nil { + common.ErrorResp(c, err, 500) + return + } + dstAccount, dstPath, _, err := common.ParsePath(utils.Join(req.DstDir, req.Names[0])) + if err != nil { + common.ErrorResp(c, err, 500) + return + } + if srcAccount.Name != dstAccount.Name { + common.ErrorStrResp(c, "Can't copy files between two accounts", 400) + return + } + if srcPath == "/" || dstPath == "/" { + common.ErrorStrResp(c, "Can't copy root folder", 400) + return + } + srcDir, dstDir := utils.Dir(srcPath), utils.Dir(dstPath) + for i, name := range req.Names { + clearCache := false + if i == len(req.Names)-1 { + clearCache = true + } + err := operate.Copy(srcDriver, srcAccount, utils.Join(srcDir, name), utils.Join(dstDir, name), clearCache) + if err != nil { + if i == 0 { + _ = base.DeleteCache(srcDir, srcAccount) + _ = base.DeleteCache(dstDir, dstAccount) + } + common.ErrorResp(c, err, 500) + return + } + } + common.SuccessResp(c) +} diff --git a/server/controllers/file/move.go b/server/controllers/file/move.go index a4715ce2..3c1dcaff 100644 --- a/server/controllers/file/move.go +++ b/server/controllers/file/move.go @@ -9,14 +9,14 @@ import ( "github.com/gin-gonic/gin" ) -type MoveReq struct { +type MoveCopyReq struct { SrcDir string `json:"src_dir"` DstDir string `json:"dst_dir"` Names []string `json:"names"` } func Move(c *gin.Context) { - var req MoveReq + var req MoveCopyReq if err := c.ShouldBind(&req); err != nil { common.ErrorResp(c, err, 400) return diff --git a/server/controllers/file/raname.go b/server/controllers/file/raname.go index a5512539..f095b2a6 100644 --- a/server/controllers/file/raname.go +++ b/server/controllers/file/raname.go @@ -24,7 +24,7 @@ func Rename(c *gin.Context) { return } if path_ == "/" { - common.ErrorStrResp(c, "Can't account name here", 400) + common.ErrorStrResp(c, "Can't edit account name here", 400) return } err = operate.Move(driver, account, path_, utils.Join(utils.Dir(path_), req.Name), true) diff --git a/server/router.go b/server/router.go index 97445602..4fb62f6d 100644 --- a/server/router.go +++ b/server/router.go @@ -54,6 +54,7 @@ func InitApiRouter(r *gin.Engine) { admin.POST("/mkdir", file.Mkdir) admin.POST("/rename", file.Rename) admin.POST("/move", file.Move) + admin.POST("/copy", file.Copy) admin.POST("/folder", file.Folder) } WebDav(r)