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 9.7 kB

10 months ago
10 months ago
10 months ago
2 years ago
2 years ago
10 months ago
10 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package cdsapi
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "mime"
  7. "net/http"
  8. "net/url"
  9. "strings"
  10. "time"
  11. v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
  12. "github.com/aws/aws-sdk-go-v2/credentials"
  13. "gitlink.org.cn/cloudream/common/consts/errorcode"
  14. "gitlink.org.cn/cloudream/common/pkgs/iterator"
  15. "gitlink.org.cn/cloudream/common/sdks"
  16. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  17. "gitlink.org.cn/cloudream/common/utils/http2"
  18. "gitlink.org.cn/cloudream/common/utils/serder"
  19. )
  20. type PackageService struct {
  21. *Client
  22. }
  23. func (c *Client) Package() *PackageService {
  24. return &PackageService{c}
  25. }
  26. const PackageGetPath = "/package/get"
  27. type PackageGetReq struct {
  28. UserID cdssdk.UserID `form:"userID" url:"userID" binding:"required"`
  29. PackageID cdssdk.PackageID `form:"packageID" url:"packageID" binding:"required"`
  30. }
  31. func (r *PackageGetReq) MakeParam() *sdks.RequestParam {
  32. return sdks.MakeQueryParam(http.MethodGet, PackageGetPath, r)
  33. }
  34. type PackageGetResp struct {
  35. cdssdk.Package
  36. }
  37. func (r *PackageGetResp) ParseResponse(resp *http.Response) error {
  38. return sdks.ParseCodeDataJSONResponse(resp, r)
  39. }
  40. func (c *PackageService) Get(req PackageGetReq) (*PackageGetResp, error) {
  41. return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageGetResp{})
  42. }
  43. const PackageGetByFullNamePath = "/package/getByFullName"
  44. type PackageGetByFullName struct {
  45. UserID cdssdk.UserID `form:"userID" url:"userID" binding:"required"`
  46. BucketName string `form:"bucketName" url:"bucketName" binding:"required"`
  47. PackageName string `form:"packageName" url:"packageName" binding:"required"`
  48. }
  49. func (r *PackageGetByFullName) MakeParam() *sdks.RequestParam {
  50. return sdks.MakeQueryParam(http.MethodGet, PackageGetByFullNamePath, r)
  51. }
  52. type PackageGetByFullNameResp struct {
  53. Package cdssdk.Package `json:"package"`
  54. }
  55. func (r *PackageGetByFullNameResp) ParseResponse(resp *http.Response) error {
  56. return sdks.ParseCodeDataJSONResponse(resp, r)
  57. }
  58. func (c *PackageService) GetByName(req PackageGetByFullName) (*PackageGetByFullNameResp, error) {
  59. return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageGetByFullNameResp{})
  60. }
  61. const PackageCreatePath = "/package/create"
  62. type PackageCreate struct {
  63. UserID cdssdk.UserID `json:"userID"`
  64. BucketID cdssdk.BucketID `json:"bucketID"`
  65. Name string `json:"name"`
  66. }
  67. func (r *PackageCreate) MakeParam() *sdks.RequestParam {
  68. return sdks.MakeJSONParam(http.MethodPost, PackageCreatePath, r)
  69. }
  70. type PackageCreateResp struct {
  71. Package cdssdk.Package `json:"package"`
  72. }
  73. func (r *PackageCreateResp) ParseResponse(resp *http.Response) error {
  74. return sdks.ParseCodeDataJSONResponse(resp, r)
  75. }
  76. func (s *PackageService) Create(req PackageCreate) (*PackageCreateResp, error) {
  77. return JSONAPI(s.cfg, http.DefaultClient, &req, &PackageCreateResp{})
  78. }
  79. const PackageCreateLoadPath = "/package/createLoad"
  80. type PackageCreateLoad struct {
  81. PackageCreateLoadInfo
  82. Files UploadObjectIterator `json:"-"`
  83. }
  84. type PackageCreateLoadInfo struct {
  85. UserID cdssdk.UserID `json:"userID" binding:"required"`
  86. BucketID cdssdk.BucketID `json:"bucketID" binding:"required"`
  87. Name string `json:"name" binding:"required"`
  88. LoadTo []cdssdk.StorageID `json:"loadTo"`
  89. LoadToPath []string `json:"loadToPath"`
  90. }
  91. type PackageCreateLoadResp struct {
  92. Package cdssdk.Package `json:"package"`
  93. Objects []cdssdk.Object `json:"objects"`
  94. }
  95. func (c *PackageService) CreateLoad(req PackageCreateLoad) (*PackageCreateLoadResp, error) {
  96. url, err := url.JoinPath(c.cfg.URL, PackageCreateLoadPath)
  97. if err != nil {
  98. return nil, err
  99. }
  100. infoJSON, err := serder.ObjectToJSON(req)
  101. if err != nil {
  102. return nil, fmt.Errorf("upload info to json: %w", err)
  103. }
  104. resp, err := PostMultiPart(c.cfg, url,
  105. map[string]string{"info": string(infoJSON)},
  106. iterator.Map(req.Files, func(src *UploadingObject) (*http2.IterMultiPartFile, error) {
  107. return &http2.IterMultiPartFile{
  108. FieldName: "files",
  109. FileName: src.Path,
  110. File: src.File,
  111. }, nil
  112. }))
  113. if err != nil {
  114. return nil, err
  115. }
  116. codeResp, err := ParseJSONResponse[response[PackageCreateLoadResp]](resp)
  117. if err != nil {
  118. return nil, err
  119. }
  120. if codeResp.Code == errorcode.OK {
  121. return &codeResp.Data, nil
  122. }
  123. return nil, codeResp.ToError()
  124. }
  125. const PackageDownloadPath = "/v1/package/download"
  126. type PackageDownload struct {
  127. UserID cdssdk.UserID `url:"userID" form:"userID" binding:"required"`
  128. PackageID cdssdk.PackageID `url:"packageID" form:"packageID" binding:"required"`
  129. }
  130. func (r *PackageDownload) MakeParam() *sdks.RequestParam {
  131. return sdks.MakeJSONParam(http.MethodGet, PackageDownloadPath, r)
  132. }
  133. type DownloadingPackage struct {
  134. Name string
  135. File io.ReadCloser
  136. }
  137. func (c *PackageService) Download(req PackageDownload) (*DownloadingPackage, error) {
  138. httpReq, err := req.MakeParam().MakeRequest(c.cfg.URL)
  139. if err != nil {
  140. return nil, err
  141. }
  142. if c.cfg.AccessKey != "" && c.cfg.SecretKey != "" {
  143. prod := credentials.NewStaticCredentialsProvider(c.cfg.AccessKey, c.cfg.SecretKey, "")
  144. cred, err := prod.Retrieve(context.TODO())
  145. if err != nil {
  146. return nil, err
  147. }
  148. signer := v4.NewSigner()
  149. err = signer.SignHTTP(context.Background(), cred, httpReq, "", AuthService, AuthRegion, time.Now())
  150. if err != nil {
  151. return nil, err
  152. }
  153. }
  154. resp, err := http.DefaultClient.Do(httpReq)
  155. if err != nil {
  156. return nil, err
  157. }
  158. contType := resp.Header.Get("Content-Type")
  159. if strings.Contains(contType, http2.ContentTypeJSON) {
  160. var codeResp response[any]
  161. if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil {
  162. return nil, fmt.Errorf("parsing response: %w", err)
  163. }
  164. return nil, codeResp.ToError()
  165. }
  166. _, params, err := mime.ParseMediaType(resp.Header.Get("Content-Disposition"))
  167. if err != nil {
  168. return nil, fmt.Errorf("parsing content disposition: %w", err)
  169. }
  170. return &DownloadingPackage{
  171. Name: params["filename"],
  172. File: resp.Body,
  173. }, nil
  174. }
  175. const PackageDeletePath = "/package/delete"
  176. type PackageDelete struct {
  177. UserID cdssdk.UserID `json:"userID" binding:"required"`
  178. PackageID cdssdk.PackageID `json:"packageID" binding:"required"`
  179. }
  180. func (r *PackageDelete) MakeParam() *sdks.RequestParam {
  181. return sdks.MakeJSONParam(http.MethodPost, PackageDeletePath, r)
  182. }
  183. type PackageDeleteResp struct{}
  184. func (r *PackageDeleteResp) ParseResponse(resp *http.Response) error {
  185. return sdks.ParseCodeDataJSONResponse(resp, r)
  186. }
  187. func (c *PackageService) Delete(req PackageDelete) error {
  188. return JSONAPINoData(c.cfg, http.DefaultClient, &req)
  189. }
  190. const PackageClonePath = "/package/clone"
  191. type PackageClone struct {
  192. UserID cdssdk.UserID `json:"userID" binding:"required"`
  193. PackageID cdssdk.PackageID `json:"packageID" binding:"required"`
  194. BucketID cdssdk.BucketID `json:"bucketID" binding:"required"`
  195. Name string `json:"name" binding:"required"`
  196. }
  197. func (r *PackageClone) MakeParam() *sdks.RequestParam {
  198. return sdks.MakeJSONParam(http.MethodPost, PackageClonePath, r)
  199. }
  200. type PackageCloneResp struct {
  201. Package cdssdk.Package `json:"package"`
  202. }
  203. func (r *PackageCloneResp) ParseResponse(resp *http.Response) error {
  204. return sdks.ParseCodeDataJSONResponse(resp, r)
  205. }
  206. func (c *PackageService) Clone(req PackageClone) (*PackageCloneResp, error) {
  207. return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageCloneResp{})
  208. }
  209. const PackageListBucketPackagesPath = "/package/listBucketPackages"
  210. type PackageListBucketPackages struct {
  211. UserID cdssdk.UserID `form:"userID" url:"userID" binding:"required"`
  212. BucketID cdssdk.BucketID `form:"bucketID" url:"bucketID" binding:"required"`
  213. }
  214. func (r *PackageListBucketPackages) MakeParam() *sdks.RequestParam {
  215. return sdks.MakeQueryParam(http.MethodGet, PackageListBucketPackagesPath, r)
  216. }
  217. type PackageListBucketPackagesResp struct {
  218. Packages []cdssdk.Package `json:"packages"`
  219. }
  220. func (r *PackageListBucketPackagesResp) ParseResponse(resp *http.Response) error {
  221. return sdks.ParseCodeDataJSONResponse(resp, r)
  222. }
  223. func (c *PackageService) ListBucketPackages(req PackageListBucketPackages) (*PackageListBucketPackagesResp, error) {
  224. return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageListBucketPackagesResp{})
  225. }
  226. const PackageGetCachedStoragesPath = "/package/getCachedStorages"
  227. type PackageGetCachedStoragesReq struct {
  228. PackageID cdssdk.PackageID `form:"packageID" url:"packageID" binding:"required"`
  229. UserID cdssdk.UserID `form:"userID" url:"userID" binding:"required"`
  230. }
  231. func (r *PackageGetCachedStoragesReq) MakeParam() *sdks.RequestParam {
  232. return sdks.MakeQueryParam(http.MethodGet, PackageGetCachedStoragesPath, r)
  233. }
  234. type PackageGetCachedStoragesResp struct {
  235. cdssdk.PackageCachingInfo
  236. }
  237. func (r *PackageGetCachedStoragesResp) ParseResponse(resp *http.Response) error {
  238. return sdks.ParseCodeDataJSONResponse(resp, r)
  239. }
  240. func (c *PackageService) GetCachedStorages(req PackageGetCachedStoragesReq) (*PackageGetCachedStoragesResp, error) {
  241. return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageGetCachedStoragesResp{})
  242. }
  243. const PackageCalcHashPath = "/v1/package/calcHash"
  244. type PackageCalcHash struct {
  245. UserID cdssdk.UserID `json:"userID" binding:"required"`
  246. PackageID cdssdk.PackageID `json:"packageID" binding:"required"`
  247. }
  248. func (r *PackageCalcHash) MakeParam() *sdks.RequestParam {
  249. return sdks.MakeJSONParam(http.MethodPost, PackageCalcHashPath, r)
  250. }
  251. type PackageCalcHashResp struct {
  252. cdssdk.PackageHash
  253. }
  254. func (r *PackageCalcHashResp) ParseResponse(resp *http.Response) error {
  255. return sdks.ParseCodeDataJSONResponse(resp, r)
  256. }
  257. func (c *PackageService) CalcHash(req PackageCalcHash) (*PackageCalcHashResp, error) {
  258. return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageCalcHashResp{})
  259. }