You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

package.go 8.2 kB

7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. package api
  2. import (
  3. "fmt"
  4. "io"
  5. "mime"
  6. "net/http"
  7. "net/url"
  8. "strings"
  9. "gitlink.org.cn/cloudream/common/consts/errorcode"
  10. "gitlink.org.cn/cloudream/common/pkgs/iterator"
  11. "gitlink.org.cn/cloudream/common/sdks"
  12. "gitlink.org.cn/cloudream/common/utils/http2"
  13. "gitlink.org.cn/cloudream/common/utils/serder"
  14. jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
  15. )
  16. type PackageService struct {
  17. *Client
  18. }
  19. func (c *Client) Package() *PackageService {
  20. return &PackageService{c}
  21. }
  22. const PackageGetPath = "/package/get"
  23. type PackageGet struct {
  24. PackageID jcstypes.PackageID `form:"packageID" url:"packageID" binding:"required"`
  25. }
  26. func (r *PackageGet) MakeParam() *sdks.RequestParam {
  27. return sdks.MakeQueryParam(http.MethodGet, PackageGetPath, r)
  28. }
  29. type PackageGetResp struct {
  30. Package jcstypes.Package `json:"package"`
  31. }
  32. func (r *PackageGetResp) ParseResponse(resp *http.Response) error {
  33. return sdks.ParseCodeDataJSONResponse(resp, r)
  34. }
  35. func (c *PackageService) Get(req PackageGet) (*PackageGetResp, error) {
  36. return JSONAPI(&c.cfg, c.httpCli, &req, &PackageGetResp{})
  37. }
  38. const PackageGetByFullNamePath = "/package/getByFullName"
  39. type PackageGetByFullName struct {
  40. BucketName string `form:"bucketName" url:"bucketName" binding:"required"`
  41. PackageName string `form:"packageName" url:"packageName" binding:"required"`
  42. }
  43. func (r *PackageGetByFullName) MakeParam() *sdks.RequestParam {
  44. return sdks.MakeQueryParam(http.MethodGet, PackageGetByFullNamePath, r)
  45. }
  46. type PackageGetByFullNameResp struct {
  47. Package jcstypes.Package `json:"package"`
  48. }
  49. func (r *PackageGetByFullNameResp) ParseResponse(resp *http.Response) error {
  50. return sdks.ParseCodeDataJSONResponse(resp, r)
  51. }
  52. func (c *PackageService) GetByFullName(req PackageGetByFullName) (*PackageGetByFullNameResp, error) {
  53. return JSONAPI(&c.cfg, c.httpCli, &req, &PackageGetByFullNameResp{})
  54. }
  55. const PackageCreatePath = "/package/create"
  56. type PackageCreate struct {
  57. BucketID jcstypes.BucketID `json:"bucketID"`
  58. Name string `json:"name"`
  59. }
  60. func (r *PackageCreate) MakeParam() *sdks.RequestParam {
  61. return sdks.MakeJSONParam(http.MethodPost, PackageCreatePath, r)
  62. }
  63. type PackageCreateResp struct {
  64. Package jcstypes.Package `json:"package"`
  65. }
  66. func (r *PackageCreateResp) ParseResponse(resp *http.Response) error {
  67. return sdks.ParseCodeDataJSONResponse(resp, r)
  68. }
  69. func (s *PackageService) Create(req PackageCreate) (*PackageCreateResp, error) {
  70. return JSONAPI(&s.cfg, s.httpCli, &req, &PackageCreateResp{})
  71. }
  72. const PackageCreateUploadPath = "/package/createUpload"
  73. type PackageCreateUpload struct {
  74. PackageCreateUploadInfo
  75. Files UploadObjectIterator `json:"-"`
  76. }
  77. type PackageCreateUploadInfo struct {
  78. BucketID jcstypes.BucketID `json:"bucketID" binding:"required"`
  79. Name string `json:"name" binding:"required"`
  80. CopyTo []jcstypes.UserSpaceID `json:"copyTo"`
  81. CopyToPath []string `json:"copyToPath"`
  82. }
  83. type PackageCreateUploadResp struct {
  84. Package jcstypes.Package `json:"package"`
  85. Objects []jcstypes.Object `json:"objects"`
  86. }
  87. func (c *PackageService) CreateUpload(req PackageCreateUpload) (*PackageCreateUploadResp, error) {
  88. url, err := url.JoinPath(c.cfg.EndPoint, "v1", PackageCreateUploadPath)
  89. if err != nil {
  90. return nil, err
  91. }
  92. infoJSON, err := serder.ObjectToJSON(req)
  93. if err != nil {
  94. return nil, fmt.Errorf("upload info to json: %w", err)
  95. }
  96. resp, err := PostMultiPart(&c.cfg, c.httpCli, url,
  97. map[string]string{"info": string(infoJSON)},
  98. iterator.Map(req.Files, func(src *UploadingObject) (*http2.IterMultiPartFile, error) {
  99. return &http2.IterMultiPartFile{
  100. FieldName: "files",
  101. FileName: src.Path,
  102. File: src.File,
  103. }, nil
  104. }))
  105. if err != nil {
  106. return nil, err
  107. }
  108. codeResp, err := ParseJSONResponse[response[PackageCreateUploadResp]](resp)
  109. if err != nil {
  110. return nil, err
  111. }
  112. if codeResp.Code == errorcode.OK {
  113. return &codeResp.Data, nil
  114. }
  115. return nil, codeResp.ToError()
  116. }
  117. const PackageDownloadPath = "/package/download"
  118. type PackageDownload struct {
  119. PackageID jcstypes.PackageID `url:"packageID" form:"packageID" binding:"required"`
  120. Prefix string `url:"prefix" form:"prefix"`
  121. NewPrefix *string `url:"newPrefix,omitempty" form:"newPrefix"`
  122. Zip bool `url:"zip,omitempty" form:"zip"`
  123. }
  124. func (r *PackageDownload) MakeParam() *sdks.RequestParam {
  125. return sdks.MakeQueryParam(http.MethodGet, PackageDownloadPath, r)
  126. }
  127. type DownloadingPackage struct {
  128. Name string
  129. File io.ReadCloser
  130. }
  131. func (c *PackageService) Download(req PackageDownload) (*DownloadingPackage, error) {
  132. url, err := url.JoinPath(c.cfg.EndPoint, "v1")
  133. if err != nil {
  134. return nil, err
  135. }
  136. httpReq, err := req.MakeParam().MakeRequest(url)
  137. if err != nil {
  138. return nil, err
  139. }
  140. resp, err := c.Client.httpCli.Do(httpReq)
  141. if err != nil {
  142. return nil, err
  143. }
  144. contType := resp.Header.Get("Content-Type")
  145. if resp.StatusCode != http.StatusOK {
  146. return nil, fmt.Errorf("response status code: %d", resp.StatusCode)
  147. }
  148. if strings.Contains(contType, http2.ContentTypeJSON) {
  149. var codeResp response[any]
  150. if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil {
  151. return nil, fmt.Errorf("parsing response: %w", err)
  152. }
  153. return nil, codeResp.ToError()
  154. }
  155. _, params, err := mime.ParseMediaType(resp.Header.Get("Content-Disposition"))
  156. if err != nil {
  157. return nil, fmt.Errorf("parsing content disposition: %w", err)
  158. }
  159. return &DownloadingPackage{
  160. Name: params["filename"],
  161. File: resp.Body,
  162. }, nil
  163. }
  164. const PackageDeletePath = "/package/delete"
  165. type PackageDelete struct {
  166. PackageID jcstypes.PackageID `json:"packageID" binding:"required"`
  167. }
  168. func (r *PackageDelete) MakeParam() *sdks.RequestParam {
  169. return sdks.MakeJSONParam(http.MethodPost, PackageDeletePath, r)
  170. }
  171. type PackageDeleteResp struct{}
  172. func (r *PackageDeleteResp) ParseResponse(resp *http.Response) error {
  173. return sdks.ParseCodeDataJSONResponse(resp, r)
  174. }
  175. func (c *PackageService) Delete(req PackageDelete) error {
  176. return JSONAPINoData(&c.cfg, c.httpCli, &req)
  177. }
  178. const PackageClonePath = "/package/clone"
  179. type PackageClone struct {
  180. PackageID jcstypes.PackageID `json:"packageID" binding:"required"`
  181. BucketID jcstypes.BucketID `json:"bucketID" binding:"required"`
  182. Name string `json:"name" binding:"required"`
  183. }
  184. func (r *PackageClone) MakeParam() *sdks.RequestParam {
  185. return sdks.MakeJSONParam(http.MethodPost, PackageClonePath, r)
  186. }
  187. type PackageCloneResp struct {
  188. Package jcstypes.Package `json:"package"`
  189. }
  190. func (r *PackageCloneResp) ParseResponse(resp *http.Response) error {
  191. return sdks.ParseCodeDataJSONResponse(resp, r)
  192. }
  193. func (c *PackageService) Clone(req PackageClone) (*PackageCloneResp, error) {
  194. return JSONAPI(&c.cfg, c.httpCli, &req, &PackageCloneResp{})
  195. }
  196. const PackageListBucketPackagesPath = "/package/listBucketPackages"
  197. type PackageListBucketPackages struct {
  198. BucketID jcstypes.BucketID `form:"bucketID" url:"bucketID" binding:"required"`
  199. }
  200. func (r *PackageListBucketPackages) MakeParam() *sdks.RequestParam {
  201. return sdks.MakeQueryParam(http.MethodGet, PackageListBucketPackagesPath, r)
  202. }
  203. type PackageListBucketPackagesResp struct {
  204. Packages []jcstypes.Package `json:"packages"`
  205. }
  206. func (r *PackageListBucketPackagesResp) ParseResponse(resp *http.Response) error {
  207. return sdks.ParseCodeDataJSONResponse(resp, r)
  208. }
  209. func (c *PackageService) ListBucketPackages(req PackageListBucketPackages) (*PackageListBucketPackagesResp, error) {
  210. return JSONAPI(&c.cfg, c.httpCli, &req, &PackageListBucketPackagesResp{})
  211. }
  212. const PackagePinPath = "/package/pin"
  213. type PackagePin struct {
  214. PackageID jcstypes.PackageID `json:"packageID" binding:"required"`
  215. Pin bool `json:"pin" binding:"required"`
  216. }
  217. func (r *PackagePin) MakeParam() *sdks.RequestParam {
  218. return sdks.MakeJSONParam(http.MethodPost, PackagePinPath, r)
  219. }
  220. type PackagePinResp struct{}
  221. func (r *PackagePinResp) ParseResponse(resp *http.Response) error {
  222. return sdks.ParseCodeDataJSONResponse(resp, r)
  223. }
  224. func (c *PackageService) Pin(req PackagePin) (*PackagePinResp, error) {
  225. return JSONAPI(&c.cfg, c.httpCli, &req, &PackagePinResp{})
  226. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。