diff --git a/sdks/storage/cdsapi/package.go b/sdks/storage/cdsapi/package.go index 6be57aa..a9418ff 100644 --- a/sdks/storage/cdsapi/package.go +++ b/sdks/storage/cdsapi/package.go @@ -221,6 +221,44 @@ func (c *PackageService) Delete(req PackageDelete) error { return fmt.Errorf("unknow response content type: %s", contType) } +const PackageClonePath = "/package/clone" + +type PackageClone struct { + UserID cdssdk.UserID `json:"userID" binding:"required"` + PackageID cdssdk.PackageID `json:"packageID" binding:"required"` + BucketID cdssdk.BucketID `json:"bucketID" binding:"required"` + Name string `json:"name" binding:"required"` +} + +type PackageCloneResp struct { + Package cdssdk.Package `json:"package"` +} + +func (c *PackageService) Clone(req PackageClone) (*PackageCloneResp, error) { + url, err := url.JoinPath(c.baseURL, PackageClonePath) + if err != nil { + return nil, err + } + + resp, err := http2.PostJSON(url, http2.RequestParam{ + Body: req, + }) + if err != nil { + return nil, err + } + + codeResp, err := ParseJSONResponse[response[PackageCloneResp]](resp) + if err != nil { + return nil, err + } + + if codeResp.Code == errorcode.OK { + return &codeResp.Data, nil + } + + return nil, codeResp.ToError() +} + const PackageListBucketPackagesPath = "/package/listBucketPackages" type PackageListBucketPackages struct {