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

2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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 PackageGetByNamePath = "/package/getByName"
  47. type PackageGetByName 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 PackageGetByNameResp struct {
  53. Package cdssdk.Package `json:"package"`
  54. }
  55. func (c *PackageService) GetByName(req PackageGetByName) (*PackageGetByNameResp, error) {
  56. url, err := url.JoinPath(c.baseURL, PackageGetByNamePath)
  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[PackageGetByNameResp]](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" binding:"required"`
  114. }
  115. type PackageCreateLoadResp struct {
  116. Package cdssdk.Package `json:"package"`
  117. Objects []cdssdk.Object `json:"objects"`
  118. LoadedDirs []string `json:"loadedDirs"`
  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 PackageListBucketPackagesPath = "/package/listBucketPackages"
  181. type PackageListBucketPackages struct {
  182. UserID cdssdk.UserID `form:"userID" json:"userID" binding:"required"`
  183. BucketID cdssdk.BucketID `form:"bucketID" json:"bucketID" binding:"required"`
  184. }
  185. type PackageListBucketPackagesResp struct {
  186. Packages []cdssdk.Package `json:"packages"`
  187. }
  188. func (c *PackageService) ListBucketPackages(req PackageListBucketPackages) (*PackageListBucketPackagesResp, error) {
  189. url, err := url.JoinPath(c.baseURL, PackageListBucketPackagesPath)
  190. if err != nil {
  191. return nil, err
  192. }
  193. resp, err := http2.GetForm(url, http2.RequestParam{
  194. Query: req,
  195. })
  196. if err != nil {
  197. return nil, err
  198. }
  199. codeResp, err := ParseJSONResponse[response[PackageListBucketPackagesResp]](resp)
  200. if err != nil {
  201. return nil, err
  202. }
  203. if codeResp.Code == errorcode.OK {
  204. return &codeResp.Data, nil
  205. }
  206. return nil, codeResp.ToError()
  207. }
  208. const PackageGetCachedStoragesPath = "/package/getCachedStorages"
  209. type PackageGetCachedStoragesReq struct {
  210. PackageID cdssdk.PackageID `form:"packageID" json:"packageID" binding:"required"`
  211. UserID cdssdk.UserID `form:"userID" json:"userID" binding:"required"`
  212. }
  213. type PackageGetCachedStoragesResp struct {
  214. cdssdk.PackageCachingInfo
  215. }
  216. func (c *PackageService) GetCachedStorages(req PackageGetCachedStoragesReq) (*PackageGetCachedStoragesResp, error) {
  217. url, err := url.JoinPath(c.baseURL, PackageGetCachedStoragesPath)
  218. if err != nil {
  219. return nil, err
  220. }
  221. resp, err := http2.GetJSON(url, http2.RequestParam{
  222. Query: req,
  223. })
  224. if err != nil {
  225. return nil, err
  226. }
  227. codeResp, err := ParseJSONResponse[response[PackageGetCachedStoragesResp]](resp)
  228. if err != nil {
  229. return nil, err
  230. }
  231. if codeResp.Code == errorcode.OK {
  232. return &codeResp.Data, nil
  233. }
  234. return nil, codeResp.ToError()
  235. }
  236. const PackageGetLoadedStoragesPath = "/package/getLoadedStorages"
  237. type PackageGetLoadedStoragesReq struct {
  238. PackageID cdssdk.PackageID `form:"packageID" json:"packageID" binding:"required"`
  239. UserID cdssdk.UserID `form:"userID" json:"userID" binding:"required"`
  240. }
  241. type PackageGetLoadedStoragesResp struct {
  242. StorageIDs []cdssdk.StorageID `json:"storageIDs"`
  243. }
  244. func (c *PackageService) GetLoadedStorages(req PackageGetLoadedStoragesReq) (*PackageGetLoadedStoragesResp, error) {
  245. url, err := url.JoinPath(c.baseURL, PackageGetLoadedStoragesPath)
  246. if err != nil {
  247. return nil, err
  248. }
  249. resp, err := http2.GetJSON(url, http2.RequestParam{
  250. Query: req,
  251. })
  252. if err != nil {
  253. return nil, err
  254. }
  255. codeResp, err := ParseJSONResponse[response[PackageGetLoadedStoragesResp]](resp)
  256. if err != nil {
  257. return nil, err
  258. }
  259. if codeResp.Code == errorcode.OK {
  260. return &codeResp.Data, nil
  261. }
  262. return nil, codeResp.ToError()
  263. }