From e17baab2d5285810f0df9dc86cca74c402e3c32b Mon Sep 17 00:00:00 2001 From: "Mako (XSpy)" <127767602+x-spy@users.noreply.github.com> Date: Fri, 12 Dec 2025 12:53:16 +0800 Subject: [PATCH] add more wps func --- drivers/wps/driver.go | 89 ++++++++++++++++++++++++++++++++++++++++--- drivers/wps/meta.go | 1 + drivers/wps/types.go | 33 ++++++++++++++++ drivers/wps/util.go | 60 +++++++++++++++++++++++++++++ 4 files changed, 178 insertions(+), 5 deletions(-) diff --git a/drivers/wps/driver.go b/drivers/wps/driver.go index 870e6a20..23cd0499 100644 --- a/drivers/wps/driver.go +++ b/drivers/wps/driver.go @@ -113,23 +113,102 @@ func (d *Wps) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*m } func (d *Wps) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error { - return errs.NotSupport + basePath := "/" + if parentDir != nil { + if p := parentDir.GetPath(); p != "" { + basePath = p + } + } + node, err := d.resolvePath(ctx, basePath) + if err != nil { + return err + } + if node.kind != "group" && node.kind != "folder" { + return errs.NotSupport + } + parentID := int64(0) + if node.file != nil && node.kind == "folder" { + parentID = node.file.ID + } + return d.createFolder(ctx, node.group.GroupID, parentID, dirName) } func (d *Wps) Move(ctx context.Context, srcObj, dstDir model.Obj) error { - return errs.NotSupport + if srcObj == nil || dstDir == nil { + return errs.NotSupport + } + srcNode, err := d.resolvePath(ctx, srcObj.GetPath()) + if err != nil { + return err + } + if (srcNode.kind != "file" && srcNode.kind != "folder") || srcNode.file == nil { + return errs.NotSupport + } + dstNode, err := d.resolvePath(ctx, dstDir.GetPath()) + if err != nil { + return err + } + if dstNode.kind != "group" && dstNode.kind != "folder" { + return errs.NotSupport + } + targetParentID := int64(0) + if dstNode.file != nil && dstNode.kind == "folder" { + targetParentID = dstNode.file.ID + } + return d.moveFile(ctx, srcNode.group.GroupID, srcNode.file.ID, dstNode.group.GroupID, targetParentID) } func (d *Wps) Rename(ctx context.Context, srcObj model.Obj, newName string) error { - return errs.NotSupport + if srcObj == nil { + return errs.NotSupport + } + node, err := d.resolvePath(ctx, srcObj.GetPath()) + if err != nil { + return err + } + if (node.kind != "file" && node.kind != "folder") || node.file == nil { + return errs.NotSupport + } + return d.renameFile(ctx, node.group.GroupID, node.file.ID, newName) } func (d *Wps) Copy(ctx context.Context, srcObj, dstDir model.Obj) error { - return errs.NotSupport + if srcObj == nil || dstDir == nil { + return errs.NotSupport + } + srcNode, err := d.resolvePath(ctx, srcObj.GetPath()) + if err != nil { + return err + } + if (srcNode.kind != "file" && srcNode.kind != "folder") || srcNode.file == nil { + return errs.NotSupport + } + dstNode, err := d.resolvePath(ctx, dstDir.GetPath()) + if err != nil { + return err + } + if dstNode.kind != "group" && dstNode.kind != "folder" { + return errs.NotSupport + } + targetParentID := int64(0) + if dstNode.file != nil && dstNode.kind == "folder" { + targetParentID = dstNode.file.ID + } + return d.copyFile(ctx, srcNode.group.GroupID, srcNode.file.ID, dstNode.group.GroupID, targetParentID) } func (d *Wps) Remove(ctx context.Context, obj model.Obj) error { - return errs.NotSupport + if obj == nil { + return errs.NotSupport + } + node, err := d.resolvePath(ctx, obj.GetPath()) + if err != nil { + return err + } + if (node.kind != "file" && node.kind != "folder") || node.file == nil { + return errs.NotSupport + } + return d.deleteFile(ctx, node.group.GroupID, node.file.ID) } func (d *Wps) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error { diff --git a/drivers/wps/meta.go b/drivers/wps/meta.go index 430c175d..d929b930 100644 --- a/drivers/wps/meta.go +++ b/drivers/wps/meta.go @@ -6,6 +6,7 @@ import ( ) type Addition struct { + driver.RootPath Cookie string `json:"cookie" required:"true" help:"kso_sid=xxxxx"` } diff --git a/drivers/wps/types.go b/drivers/wps/types.go index c9627f18..f5c56fd8 100644 --- a/drivers/wps/types.go +++ b/drivers/wps/types.go @@ -49,6 +49,39 @@ type downloadResp struct { Result string `json:"result"` } +type opResp struct { + Result string `json:"result"` + Msg string `json:"msg"` +} + +type renameReq struct { + Fname string `json:"fname"` +} + +type mkdirReq struct { + GroupID int64 `json:"groupid"` + Name string `json:"name"` + ParentID int64 `json:"parentid"` +} + +type moveReq struct { + FileIDs []int64 `json:"fileids"` + TargetGroupID int64 `json:"target_groupid"` + TargetParentID int64 `json:"target_parentid"` +} + +type deleteReq struct { + FileIDs []int64 `json:"fileids"` +} + +type copyReq struct { + FileIDs []int64 `json:"fileids"` + GroupID int64 `json:"groupid"` + TargetGroupID int64 `json:"target_groupid"` + TargetParentID int64 `json:"target_parentid"` + DuplicatedNameModel int `json:"duplicated_name_model"` +} + type Obj struct { id string name string diff --git a/drivers/wps/util.go b/drivers/wps/util.go index 833de1d1..bec8d810 100644 --- a/drivers/wps/util.go +++ b/drivers/wps/util.go @@ -65,6 +65,66 @@ func (d *Wps) getFiles(ctx context.Context, groupID, parentID int64) ([]FileInfo return resp.Files, nil } +func checkResult(result, msg string) error { + if result == "" || result == "ok" { + return nil + } + if msg != "" { + return fmt.Errorf("%s: %s", result, msg) + } + return fmt.Errorf("%s", result) +} + +func (d *Wps) renameFile(ctx context.Context, groupID, fileID int64, name string) error { + var resp opResp + url := fmt.Sprintf("%s/3rd/drive/api/v3/groups/%d/files/%d", endpoint, groupID, fileID) + _, err := d.request(ctx).SetBody(renameReq{Fname: name}).SetResult(&resp).Put(url) + if err != nil { + return err + } + return checkResult(resp.Result, resp.Msg) +} + +func (d *Wps) createFolder(ctx context.Context, groupID, parentID int64, name string) error { + var resp opResp + url := endpoint + "/3rd/drive/api/v5/files/folder" + _, err := d.request(ctx).SetBody(mkdirReq{GroupID: groupID, Name: name, ParentID: parentID}).SetResult(&resp).Post(url) + if err != nil { + return err + } + return checkResult(resp.Result, resp.Msg) +} + +func (d *Wps) moveFile(ctx context.Context, groupID, fileID, targetGroupID, targetParentID int64) error { + var resp opResp + url := fmt.Sprintf("%s/3rd/drive/api/v3/groups/%d/files/batch/move", endpoint, groupID) + _, err := d.request(ctx).SetBody(moveReq{FileIDs: []int64{fileID}, TargetGroupID: targetGroupID, TargetParentID: targetParentID}).SetResult(&resp).Post(url) + if err != nil { + return err + } + return checkResult(resp.Result, resp.Msg) +} + +func (d *Wps) deleteFile(ctx context.Context, groupID, fileID int64) error { + var resp opResp + url := fmt.Sprintf("%s/3rd/drive/api/v3/groups/%d/files/batch/delete", endpoint, groupID) + _, err := d.request(ctx).SetBody(deleteReq{FileIDs: []int64{fileID}}).SetResult(&resp).Post(url) + if err != nil { + return err + } + return checkResult(resp.Result, resp.Msg) +} + +func (d *Wps) copyFile(ctx context.Context, groupID, fileID, targetGroupID, targetParentID int64) error { + var resp opResp + url := fmt.Sprintf("%s/3rd/drive/api/v3/groups/%d/files/batch/copy", endpoint, groupID) + _, err := d.request(ctx).SetBody(copyReq{FileIDs: []int64{fileID}, GroupID: groupID, TargetGroupID: targetGroupID, TargetParentID: targetParentID, DuplicatedNameModel: 1}).SetResult(&resp).Post(url) + if err != nil { + return err + } + return checkResult(resp.Result, resp.Msg) +} + func parseTime(v int64) time.Time { if v <= 0 { return time.Time{}