diff --git a/consts/errorcode/error_code.go b/consts/errorcode/error_code.go index fc9e00c..984ca9c 100644 --- a/consts/errorcode/error_code.go +++ b/consts/errorcode/error_code.go @@ -4,6 +4,7 @@ const ( OK = "OK" OperationFailed = "OperationFailed" DataNotFound = "DataNotFound" + DataExists = "DataExists" BadArgument = "BadArgument" TaskNotFound = "TaskNotFound" ) diff --git a/sdks/storage/cdsapi/object.go b/sdks/storage/cdsapi/object.go index 1f37c16..a6708f9 100644 --- a/sdks/storage/cdsapi/object.go +++ b/sdks/storage/cdsapi/object.go @@ -28,9 +28,10 @@ func (c *Client) Object() *ObjectService { const ObjectListPath = "/object/list" type ObjectList struct { - UserID cdssdk.UserID `form:"userID" binding:"required"` - PackageID cdssdk.PackageID `form:"packageID" binding:"required"` - PathPrefix string `form:"pathPrefix" binding:"required"` + UserID cdssdk.UserID `form:"userID" binding:"required"` + PackageID cdssdk.PackageID `form:"packageID" binding:"required"` + Path string `form:"path" binding:"required"` + IsPrefix bool `form:"isPrefix"` } type ObjectListResp struct { Objects []cdssdk.Object `json:"objects"` @@ -178,6 +179,51 @@ func (c *ObjectService) Download(req ObjectDownload) (*DownloadingObject, error) }, nil } +const ObjectDownloadByPathPath = "/object/downloadByPath" + +type ObjectDownloadByPath struct { + UserID cdssdk.UserID `form:"userID" json:"userID" binding:"required"` + PackageID cdssdk.PackageID `form:"packageID" json:"packageID" binding:"required"` + Path string `form:"path" json:"path" binding:"required"` + Offset int64 `form:"offset" json:"offset,omitempty"` + Length *int64 `form:"length" json:"length,omitempty"` +} + +func (c *ObjectService) DownloadByPath(req ObjectDownloadByPath) (*DownloadingObject, error) { + url, err := url.JoinPath(c.baseURL, ObjectDownloadByPathPath) + if err != nil { + return nil, err + } + + resp, err := http2.GetJSON(url, http2.RequestParam{ + Query: req, + }) + if err != nil { + return nil, err + } + + contType := resp.Header.Get("Content-Type") + + if strings.Contains(contType, http2.ContentTypeJSON) { + var codeResp response[any] + if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil { + return nil, fmt.Errorf("parsing response: %w", err) + } + + return nil, codeResp.ToError() + } + + _, params, err := mime.ParseMediaType(resp.Header.Get("Content-Disposition")) + if err != nil { + return nil, fmt.Errorf("parsing content disposition: %w", err) + } + + return &DownloadingObject{ + Path: params["filename"], + File: resp.Body, + }, nil +} + const ObjectUpdateInfoPath = "/object/updateInfo" type UpdatingObject struct { @@ -223,6 +269,42 @@ func (c *ObjectService) UpdateInfo(req ObjectUpdateInfo) (*ObjectUpdateInfoResp, return nil, jsonResp.ToError() } +const ObjectUpdateInfoByPathPath = "/object/updateInfoByPath" + +type ObjectUpdateInfoByPath struct { + UserID cdssdk.UserID `json:"userID" binding:"required"` + PackageID cdssdk.PackageID `json:"packageID" binding:"required"` + Path string `json:"path" binding:"required"` + UpdateTime time.Time `json:"updateTime" binding:"required"` +} + +type ObjectUpdateInfoByPathResp struct{} + +func (c *ObjectService) UpdateInfoByPath(req ObjectUpdateInfoByPath) (*ObjectUpdateInfoByPathResp, error) { + url, err := url.JoinPath(c.baseURL, ObjectUpdateInfoByPathPath) + if err != nil { + return nil, err + } + + resp, err := http2.PostJSON(url, http2.RequestParam{ + Body: req, + }) + if err != nil { + return nil, err + } + + jsonResp, err := ParseJSONResponse[response[ObjectUpdateInfoByPathResp]](resp) + if err != nil { + return nil, err + } + + if jsonResp.Code == errorcode.OK { + return &jsonResp.Data, nil + } + + return nil, jsonResp.ToError() +} + const ObjectMovePath = "/object/move" type MovingObject struct { @@ -304,6 +386,40 @@ func (c *ObjectService) Delete(req ObjectDelete) error { return jsonResp.ToError() } +const ObjectDeleteByPathPath = "/object/deleteByPath" + +type ObjectDeleteByPath struct { + UserID cdssdk.UserID `json:"userID" binding:"required"` + PackageID cdssdk.PackageID `json:"packageID" binding:"required"` + Path string `json:"path" binding:"required"` +} +type ObjectDeleteByPathResp struct{} + +func (c *ObjectService) DeleteByPath(req ObjectDeleteByPath) error { + url, err := url.JoinPath(c.baseURL, ObjectDeleteByPathPath) + if err != nil { + return err + } + + resp, err := http2.PostJSON(url, http2.RequestParam{ + Body: req, + }) + if err != nil { + return err + } + + jsonResp, err := ParseJSONResponse[response[ObjectDeleteByPathResp]](resp) + if err != nil { + return err + } + + if jsonResp.Code == errorcode.OK { + return nil + } + + return jsonResp.ToError() +} + const ObjectGetPackageObjectsPath = "/object/getPackageObjects" type ObjectGetPackageObjects struct {