From ba46e08e6836b3bc951fdd03a4c36bd7d997cce2 Mon Sep 17 00:00:00 2001 From: Sydonian <794346190@qq.com> Date: Tue, 1 Jul 2025 10:23:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8B=E8=BD=BDPackage?= =?UTF-8?q?=E5=88=B0UserSpace=E7=9A=84=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/internal/services/user_space.go | 3 - client/sdk/api/v1/storage_test.go | 2 +- client/sdk/api/v1/user_space.go | 34 +++++++---- jcsctl/cmd/userspace/create.go | 2 +- jcsctl/cmd/userspace/delete.go | 6 +- jcsctl/cmd/userspace/getp.go | 83 ++++++++++++++++++++++++++ jcsctl/cmd/userspace/ls.go | 6 +- jcsctl/cmd/userspace/update.go | 7 +-- 8 files changed, 115 insertions(+), 28 deletions(-) create mode 100644 jcsctl/cmd/userspace/getp.go diff --git a/client/internal/services/user_space.go b/client/internal/services/user_space.go index 2cfde61..7dfd564 100644 --- a/client/internal/services/user_space.go +++ b/client/internal/services/user_space.go @@ -186,9 +186,6 @@ func (svc *UserSpaceService) Test(req cliapi.UserSpaceTest) (*cliapi.UserSpaceTe } func (svc *UserSpaceService) DownloadPackage(packageID clitypes.PackageID, userspaceID clitypes.UserSpaceID, rootPath string) error { - coorCli := stgglb.CoordinatorRPCPool.Get() - defer coorCli.Release() - destStg := svc.UserSpaceMeta.Get(userspaceID) if destStg == nil { return fmt.Errorf("userspace not found: %d", userspaceID) diff --git a/client/sdk/api/v1/storage_test.go b/client/sdk/api/v1/storage_test.go index 31c7068..5d52e79 100644 --- a/client/sdk/api/v1/storage_test.go +++ b/client/sdk/api/v1/storage_test.go @@ -169,7 +169,7 @@ func Test_Storage(t *testing.T) { }) So(err, ShouldBeNil) - _, err = cli.UserSpaceDownloadPackage(UserSpaceDownloadPackageReq{ + _, err = cli.UserSpace().DownloadPackage(UserSpaceDownloadPackageReq{ PackageID: createResp.Package.PackageID, UserSpaceID: 1, }) diff --git a/client/sdk/api/v1/user_space.go b/client/sdk/api/v1/user_space.go index 0bacf88..e869c65 100644 --- a/client/sdk/api/v1/user_space.go +++ b/client/sdk/api/v1/user_space.go @@ -8,6 +8,14 @@ import ( cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types" ) +type UserSpaceService struct { + *Client +} + +func (c *Client) UserSpace() *UserSpaceService { + return &UserSpaceService{c} +} + const UserSpaceDownloadPackagePath = "/userSpace/downloadPackage" type UserSpaceDownloadPackageReq struct { @@ -26,7 +34,7 @@ func (r *UserSpaceDownloadPackageResp) ParseResponse(resp *http.Response) error return sdks.ParseCodeDataJSONResponse(resp, r) } -func (c *Client) UserSpaceDownloadPackage(req UserSpaceDownloadPackageReq) (*UserSpaceDownloadPackageResp, error) { +func (c *UserSpaceService) DownloadPackage(req UserSpaceDownloadPackageReq) (*UserSpaceDownloadPackageResp, error) { return JSONAPI(&c.cfg, c.httpCli, &req, &UserSpaceDownloadPackageResp{}) } @@ -52,7 +60,7 @@ func (r *UserSpaceCreatePackageResp) ParseResponse(resp *http.Response) error { return sdks.ParseCodeDataJSONResponse(resp, r) } -func (c *Client) UserSpaceCreatePackage(req UserSpaceCreatePackageReq) (*UserSpaceCreatePackageResp, error) { +func (c *UserSpaceService) CreatePackage(req UserSpaceCreatePackageReq) (*UserSpaceCreatePackageResp, error) { return JSONAPI(&c.cfg, c.httpCli, &req, &UserSpaceCreatePackageResp{}) } @@ -74,11 +82,11 @@ func (r *UserSpaceGetResp) ParseResponse(resp *http.Response) error { return sdks.ParseCodeDataJSONResponse(resp, r) } -func (c *Client) UserSpaceGet(req UserSpaceGet) (*UserSpaceGetResp, error) { +func (c *UserSpaceService) Get(req UserSpaceGet) (*UserSpaceGetResp, error) { return JSONAPI(&c.cfg, c.httpCli, &req, &UserSpaceGetResp{}) } -const UserSpaceGetByNamePath = "/userspace/getByName" +const UserSpaceGetByNamePath = "/userSpace/getByName" type UserSpaceGetByName struct { Name string `form:"name" url:"name" binding:"required"` @@ -89,18 +97,18 @@ func (r *UserSpaceGetByName) MakeParam() *sdks.RequestParam { } type UserSpaceGetByNameResp struct { - clitypes.UserSpace + UserSpace clitypes.UserSpace `json:"userSpace"` } func (r *UserSpaceGetByNameResp) ParseResponse(resp *http.Response) error { return sdks.ParseCodeDataJSONResponse(resp, r) } -func (c *Client) UserSpaceGetByName(req UserSpaceGetByName) (*UserSpaceGetByNameResp, error) { +func (c *UserSpaceService) GetByName(req UserSpaceGetByName) (*UserSpaceGetByNameResp, error) { return JSONAPI(&c.cfg, c.httpCli, &req, &UserSpaceGetByNameResp{}) } -const UserSpaceGetAllPath = "/userspace/getAll" +const UserSpaceGetAllPath = "/userSpace/getAll" type UserSpaceGetAll struct{} @@ -116,7 +124,7 @@ func (r *UserSpaceGetAllResp) ParseResponse(resp *http.Response) error { return sdks.ParseCodeDataJSONResponse(resp, r) } -func (c *Client) UserSpaceGetAll() (*UserSpaceGetAllResp, error) { +func (c *UserSpaceService) GetAll() (*UserSpaceGetAllResp, error) { req := UserSpaceGetAll{} return JSONAPI(&c.cfg, c.httpCli, &req, &UserSpaceGetAllResp{}) } @@ -145,7 +153,7 @@ func (r *UserSpaceCreateResp) ParseResponse(resp *http.Response) error { return sdks.ParseCodeDataJSONResponse(resp, r) } -func (c *Client) UserSpaceCreate(req UserSpaceCreate) (*UserSpaceCreateResp, error) { +func (c *UserSpaceService) Create(req UserSpaceCreate) (*UserSpaceCreateResp, error) { return JSONAPI(&c.cfg, c.httpCli, &req, &UserSpaceCreateResp{}) } @@ -164,14 +172,14 @@ func (r *UserSpaceUpdate) MakeParam() *sdks.RequestParam { } type UserSpaceUpdateResp struct { - clitypes.UserSpace + UserSpace clitypes.UserSpace `json:"userSpace"` } func (r *UserSpaceUpdateResp) ParseResponse(resp *http.Response) error { return sdks.ParseCodeDataJSONResponse(resp, r) } -func (c *Client) UserSpaceUpdate(req UserSpaceUpdate) (*UserSpaceUpdateResp, error) { +func (c *UserSpaceService) Update(req UserSpaceUpdate) (*UserSpaceUpdateResp, error) { return JSONAPI(&c.cfg, c.httpCli, &req, &UserSpaceUpdateResp{}) } @@ -192,7 +200,7 @@ func (r *UserSpaceDeleteResp) ParseResponse(resp *http.Response) error { return sdks.ParseCodeDataJSONResponse(resp, r) } -func (c *Client) UserSpaceDelete(req UserSpaceDelete) (*UserSpaceDeleteResp, error) { +func (c *UserSpaceService) Delete(req UserSpaceDelete) (*UserSpaceDeleteResp, error) { return JSONAPI(&c.cfg, c.httpCli, &req, &UserSpaceDeleteResp{}) } @@ -217,6 +225,6 @@ func (r *UserSpaceTestResp) ParseResponse(resp *http.Response) error { return sdks.ParseCodeDataJSONResponse(resp, r) } -func (c *Client) UserSpaceTest(req UserSpaceTest) (*UserSpaceTestResp, error) { +func (c *UserSpaceService) Test(req UserSpaceTest) (*UserSpaceTestResp, error) { return JSONAPI(&c.cfg, c.httpCli, &req, &UserSpaceTestResp{}) } diff --git a/jcsctl/cmd/userspace/create.go b/jcsctl/cmd/userspace/create.go index 71d2e30..b2794cf 100644 --- a/jcsctl/cmd/userspace/create.go +++ b/jcsctl/cmd/userspace/create.go @@ -79,7 +79,7 @@ func create(c *cobra.Command, ctx *cmd.CommandContext) { return } - _, err = ctx.Client.UserSpaceCreate(userSpace.UserSpaceCreate) + _, err = ctx.Client.UserSpace().Create(userSpace.UserSpaceCreate) if err != nil { fmt.Printf("\033[31m保存配置失败: %v\033[0m", err) return diff --git a/jcsctl/cmd/userspace/delete.go b/jcsctl/cmd/userspace/delete.go index ad1e462..9821ba4 100644 --- a/jcsctl/cmd/userspace/delete.go +++ b/jcsctl/cmd/userspace/delete.go @@ -60,7 +60,7 @@ func delete(c *cobra.Command, ctx *cmd.CommandContext) { return } - resp, err := ctx.Client.UserSpaceGet(cliapi.UserSpaceGet{ + resp, err := ctx.Client.UserSpace().Get(cliapi.UserSpaceGet{ UserSpaceID: clitypes.UserSpaceID(id), }) if err != nil { @@ -78,7 +78,7 @@ func delete(c *cobra.Command, ctx *cmd.CommandContext) { } name := strings.TrimSpace(nameInput) - resp, err := ctx.Client.UserSpaceGetByName(cliapi.UserSpaceGetByName{ + resp, err := ctx.Client.UserSpace().GetByName(cliapi.UserSpaceGetByName{ Name: name, }) if err != nil { @@ -100,7 +100,7 @@ func delete(c *cobra.Command, ctx *cmd.CommandContext) { return } - _, err = ctx.Client.UserSpaceDelete(cliapi.UserSpaceDelete{ + _, err = ctx.Client.UserSpace().Delete(cliapi.UserSpaceDelete{ UserSpaceID: userSpace.UserSpaceID, }) if err != nil { diff --git a/jcsctl/cmd/userspace/getp.go b/jcsctl/cmd/userspace/getp.go new file mode 100644 index 0000000..b7734f3 --- /dev/null +++ b/jcsctl/cmd/userspace/getp.go @@ -0,0 +1,83 @@ +package userspace + +import ( + "fmt" + "strings" + "time" + + "github.com/spf13/cobra" + cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1" + "gitlink.org.cn/cloudream/jcs-pub/jcsctl/cmd" +) + +func init() { + var opt option + c := &cobra.Command{ + Use: "getp / :", + Short: "download package all files to user space", + Args: cobra.ExactArgs(2), + RunE: func(c *cobra.Command, args []string) error { + ctx := cmd.GetCmdCtx(c) + return getp(c, ctx, opt, args) + }, + } + // c.Flags().StringVar(&opt.Prefix, "prefix", "", "download objects with this prefix") + // c.Flags().StringVar(&opt.NewPrefix, "new", "", "replace prefix specified by --prefix with this prefix") + // c.Flags().BoolVar(&opt.Zip, "zip", false, "download as zip file") + // c.Flags().StringVarP(&opt.Output, "output", "o", "", "output zip file name") + UserSpaceCmd.AddCommand(c) +} + +type option struct { + // Prefix string + // NewPrefix string + // Zip bool + // Output string +} + +func getp(c *cobra.Command, ctx *cmd.CommandContext, opt option, args []string) error { + comps := strings.Split(args[0], "/") + if len(comps) != 2 { + return fmt.Errorf("invalid package name: %s", args[0]) + } + + bucketName, packageName := comps[0], comps[1] + + comps = strings.Split(args[1], ":") + if len(comps) != 2 { + return fmt.Errorf("invalid space name and root path: %s", args[1]) + } + + spaceName, rootPath := comps[0], comps[1] + + getPkg, err := ctx.Client.Package().GetByFullName(cliapi.PackageGetByFullName{ + BucketName: bucketName, + PackageName: packageName, + }) + if err != nil { + return fmt.Errorf("get package %v: %w", args[0], err) + } + + getSpace, err := ctx.Client.UserSpace().GetByName(cliapi.UserSpaceGetByName{ + Name: spaceName, + }) + if err != nil { + return fmt.Errorf("get user space %v: %w", spaceName, err) + } + + startTime := time.Now() + + _, err = ctx.Client.UserSpace().DownloadPackage(cliapi.UserSpaceDownloadPackageReq{ + PackageID: getPkg.Package.PackageID, + UserSpaceID: getSpace.UserSpace.UserSpaceID, + RootPath: rootPath, + }) + if err != nil { + return fmt.Errorf("download package %v to user space %v: %w", args[0], spaceName, err) + } + + dt := time.Since(startTime) + + fmt.Printf("download package %v to user space %v success, time: %v\n", args[0], spaceName, dt) + return nil +} diff --git a/jcsctl/cmd/userspace/ls.go b/jcsctl/cmd/userspace/ls.go index 515c7ae..c6078b0 100644 --- a/jcsctl/cmd/userspace/ls.go +++ b/jcsctl/cmd/userspace/ls.go @@ -35,7 +35,7 @@ type lsOpt struct { func ls(c *cobra.Command, ctx *cmd.CommandContext, opt lsOpt, args []string) error { // 仅ls无参数 if len(args) == 0 { - resp, err := ctx.Client.UserSpaceGetAll() + resp, err := ctx.Client.UserSpace().GetAll() if err != nil { return err } @@ -58,7 +58,7 @@ func ls(c *cobra.Command, ctx *cmd.CommandContext, opt lsOpt, args []string) err return fmt.Errorf("ID必须是数字") } - result, err := ctx.Client.UserSpaceGet(cliapi.UserSpaceGet{ + result, err := ctx.Client.UserSpace().Get(cliapi.UserSpaceGet{ UserSpaceID: clitypes.UserSpaceID(id), }) if err != nil { @@ -67,7 +67,7 @@ func ls(c *cobra.Command, ctx *cmd.CommandContext, opt lsOpt, args []string) err userSpace = &result.UserSpace } else { - result, err := ctx.Client.UserSpaceGetByName(cliapi.UserSpaceGetByName{ + result, err := ctx.Client.UserSpace().GetByName(cliapi.UserSpaceGetByName{ Name: searchKey, }) if err != nil { diff --git a/jcsctl/cmd/userspace/update.go b/jcsctl/cmd/userspace/update.go index 2145688..98c7037 100644 --- a/jcsctl/cmd/userspace/update.go +++ b/jcsctl/cmd/userspace/update.go @@ -7,7 +7,6 @@ import ( "github.com/chzyer/readline" "github.com/spf13/cobra" - "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1" cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1" clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types" cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types" @@ -15,7 +14,7 @@ import ( ) type UserSpaceUpdate struct { - api.UserSpaceUpdate + cliapi.UserSpaceUpdate } func init() { @@ -50,7 +49,7 @@ func update(c *cobra.Command, ctx *cmd.CommandContext) { return } - resp, err := ctx.Client.UserSpaceGet(cliapi.UserSpaceGet{ + resp, err := ctx.Client.UserSpace().Get(cliapi.UserSpaceGet{ UserSpaceID: clitypes.UserSpaceID(id), }) if err != nil { @@ -87,7 +86,7 @@ func update(c *cobra.Command, ctx *cmd.CommandContext) { return } - _, err = ctx.Client.UserSpaceUpdate(userSpaceUpdate.UserSpaceUpdate) + _, err = ctx.Client.UserSpace().Update(userSpaceUpdate.UserSpaceUpdate) if err != nil { fmt.Printf("\033[31m更新配置失败: %v\033[0m", err) return