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.0 kB

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