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.

object.go 8.1 kB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. package cdsapi
  2. import (
  3. "fmt"
  4. "io"
  5. "mime"
  6. "net/url"
  7. "strings"
  8. "time"
  9. "gitlink.org.cn/cloudream/common/consts/errorcode"
  10. "gitlink.org.cn/cloudream/common/pkgs/iterator"
  11. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  12. "gitlink.org.cn/cloudream/common/utils/http2"
  13. "gitlink.org.cn/cloudream/common/utils/serder"
  14. )
  15. type ObjectService struct {
  16. *Client
  17. }
  18. func (c *Client) Object() *ObjectService {
  19. return &ObjectService{
  20. Client: c,
  21. }
  22. }
  23. const ObjectListPath = "/object/list"
  24. type ObjectList struct {
  25. UserID cdssdk.UserID `form:"userID" binding:"required"`
  26. PackageID cdssdk.PackageID `form:"packageID" binding:"required"`
  27. PathPrefix string `form:"pathPrefix" binding:"required"`
  28. }
  29. type ObjectListResp struct {
  30. Objects []cdssdk.Object `json:"objects"`
  31. }
  32. func (c *ObjectService) List(req ObjectList) (*ObjectListResp, error) {
  33. url, err := url.JoinPath(c.baseURL, ObjectListPath)
  34. if err != nil {
  35. return nil, err
  36. }
  37. resp, err := http2.GetForm(url, http2.RequestParam{
  38. Query: req,
  39. })
  40. if err != nil {
  41. return nil, err
  42. }
  43. jsonResp, err := ParseJSONResponse[response[ObjectListResp]](resp)
  44. if err != nil {
  45. return nil, err
  46. }
  47. if jsonResp.Code == errorcode.OK {
  48. return &jsonResp.Data, nil
  49. }
  50. return nil, jsonResp.ToError()
  51. }
  52. const ObjectUploadPath = "/object/upload"
  53. type ObjectUpload struct {
  54. ObjectUploadInfo
  55. Files UploadObjectIterator `json:"-"`
  56. }
  57. type ObjectUploadInfo struct {
  58. UserID cdssdk.UserID `json:"userID" binding:"required"`
  59. PackageID cdssdk.PackageID `json:"packageID" binding:"required"`
  60. Affinity cdssdk.StorageID `json:"affinity"`
  61. LoadTo []cdssdk.StorageID `json:"loadTo"`
  62. }
  63. type UploadingObject struct {
  64. Path string
  65. File io.ReadCloser
  66. }
  67. type UploadObjectIterator = iterator.Iterator[*UploadingObject]
  68. type ObjectUploadResp struct {
  69. Uploadeds []cdssdk.Object `json:"uploadeds"`
  70. }
  71. func (c *ObjectService) Upload(req ObjectUpload) (*ObjectUploadResp, error) {
  72. url, err := url.JoinPath(c.baseURL, ObjectUploadPath)
  73. if err != nil {
  74. return nil, err
  75. }
  76. infoJSON, err := serder.ObjectToJSON(req)
  77. if err != nil {
  78. return nil, fmt.Errorf("upload info to json: %w", err)
  79. }
  80. resp, err := http2.PostMultiPart(url, http2.MultiPartRequestParam{
  81. Form: map[string]string{"info": string(infoJSON)},
  82. Files: iterator.Map(req.Files, func(src *UploadingObject) (*http2.IterMultiPartFile, error) {
  83. return &http2.IterMultiPartFile{
  84. FieldName: "files",
  85. FileName: src.Path,
  86. File: src.File,
  87. }, nil
  88. }),
  89. })
  90. if err != nil {
  91. return nil, err
  92. }
  93. contType := resp.Header.Get("Content-Type")
  94. if strings.Contains(contType, http2.ContentTypeJSON) {
  95. var err error
  96. var codeResp response[ObjectUploadResp]
  97. if codeResp, err = serder.JSONToObjectStreamEx[response[ObjectUploadResp]](resp.Body); err != nil {
  98. return nil, fmt.Errorf("parsing response: %w", err)
  99. }
  100. if codeResp.Code == errorcode.OK {
  101. return &codeResp.Data, nil
  102. }
  103. return nil, codeResp.ToError()
  104. }
  105. return nil, fmt.Errorf("unknow response content type: %s", contType)
  106. }
  107. const ObjectDownloadPath = "/object/download"
  108. type ObjectDownload struct {
  109. UserID cdssdk.UserID `form:"userID" json:"userID" binding:"required"`
  110. ObjectID cdssdk.ObjectID `form:"objectID" json:"objectID" binding:"required"`
  111. Offset int64 `form:"offset" json:"offset,omitempty"`
  112. Length *int64 `form:"length" json:"length,omitempty"`
  113. }
  114. type DownloadingObject struct {
  115. Path string
  116. File io.ReadCloser
  117. }
  118. func (c *ObjectService) Download(req ObjectDownload) (*DownloadingObject, error) {
  119. url, err := url.JoinPath(c.baseURL, ObjectDownloadPath)
  120. if err != nil {
  121. return nil, err
  122. }
  123. resp, err := http2.GetJSON(url, http2.RequestParam{
  124. Query: req,
  125. })
  126. if err != nil {
  127. return nil, err
  128. }
  129. contType := resp.Header.Get("Content-Type")
  130. if strings.Contains(contType, http2.ContentTypeJSON) {
  131. var codeResp response[any]
  132. if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil {
  133. return nil, fmt.Errorf("parsing response: %w", err)
  134. }
  135. return nil, codeResp.ToError()
  136. }
  137. _, params, err := mime.ParseMediaType(resp.Header.Get("Content-Disposition"))
  138. if err != nil {
  139. return nil, fmt.Errorf("parsing content disposition: %w", err)
  140. }
  141. return &DownloadingObject{
  142. Path: params["filename"],
  143. File: resp.Body,
  144. }, nil
  145. }
  146. const ObjectUpdateInfoPath = "/object/updateInfo"
  147. type UpdatingObject struct {
  148. ObjectID cdssdk.ObjectID `json:"objectID" binding:"required"`
  149. UpdateTime time.Time `json:"updateTime" binding:"required"`
  150. }
  151. func (u *UpdatingObject) ApplyTo(obj *cdssdk.Object) {
  152. obj.UpdateTime = u.UpdateTime
  153. }
  154. type ObjectUpdateInfo struct {
  155. UserID cdssdk.UserID `json:"userID" binding:"required"`
  156. Updatings []UpdatingObject `json:"updatings" binding:"required"`
  157. }
  158. type ObjectUpdateInfoResp struct {
  159. Successes []cdssdk.ObjectID `json:"successes"`
  160. }
  161. func (c *ObjectService) UpdateInfo(req ObjectUpdateInfo) (*ObjectUpdateInfoResp, error) {
  162. url, err := url.JoinPath(c.baseURL, ObjectUpdateInfoPath)
  163. if err != nil {
  164. return nil, err
  165. }
  166. resp, err := http2.PostJSON(url, http2.RequestParam{
  167. Body: req,
  168. })
  169. if err != nil {
  170. return nil, err
  171. }
  172. jsonResp, err := ParseJSONResponse[response[ObjectUpdateInfoResp]](resp)
  173. if err != nil {
  174. return nil, err
  175. }
  176. if jsonResp.Code == errorcode.OK {
  177. return &jsonResp.Data, nil
  178. }
  179. return nil, jsonResp.ToError()
  180. }
  181. const ObjectMovePath = "/object/move"
  182. type MovingObject struct {
  183. ObjectID cdssdk.ObjectID `json:"objectID" binding:"required"`
  184. PackageID cdssdk.PackageID `json:"packageID" binding:"required"`
  185. Path string `json:"path" binding:"required"`
  186. }
  187. func (m *MovingObject) ApplyTo(obj *cdssdk.Object) {
  188. obj.PackageID = m.PackageID
  189. obj.Path = m.Path
  190. }
  191. type ObjectMove struct {
  192. UserID cdssdk.UserID `json:"userID" binding:"required"`
  193. Movings []MovingObject `json:"movings" binding:"required"`
  194. }
  195. type ObjectMoveResp struct {
  196. Successes []cdssdk.ObjectID `json:"successes"`
  197. }
  198. func (c *ObjectService) Move(req ObjectMove) (*ObjectMoveResp, error) {
  199. url, err := url.JoinPath(c.baseURL, ObjectMovePath)
  200. if err != nil {
  201. return nil, err
  202. }
  203. resp, err := http2.PostJSON(url, http2.RequestParam{
  204. Body: req,
  205. })
  206. if err != nil {
  207. return nil, err
  208. }
  209. jsonResp, err := ParseJSONResponse[response[ObjectMoveResp]](resp)
  210. if err != nil {
  211. return nil, err
  212. }
  213. if jsonResp.Code == errorcode.OK {
  214. return &jsonResp.Data, nil
  215. }
  216. return nil, jsonResp.ToError()
  217. }
  218. const ObjectDeletePath = "/object/delete"
  219. type ObjectDelete struct {
  220. UserID cdssdk.UserID `json:"userID" binding:"required"`
  221. ObjectIDs []cdssdk.ObjectID `json:"objectIDs" binding:"required"`
  222. }
  223. type ObjectDeleteResp struct{}
  224. func (c *ObjectService) Delete(req ObjectDelete) error {
  225. url, err := url.JoinPath(c.baseURL, ObjectDeletePath)
  226. if err != nil {
  227. return err
  228. }
  229. resp, err := http2.PostJSON(url, http2.RequestParam{
  230. Body: req,
  231. })
  232. if err != nil {
  233. return err
  234. }
  235. jsonResp, err := ParseJSONResponse[response[ObjectDeleteResp]](resp)
  236. if err != nil {
  237. return err
  238. }
  239. if jsonResp.Code == errorcode.OK {
  240. return nil
  241. }
  242. return jsonResp.ToError()
  243. }
  244. const ObjectGetPackageObjectsPath = "/object/getPackageObjects"
  245. type ObjectGetPackageObjects struct {
  246. UserID cdssdk.UserID `form:"userID" json:"userID" binding:"required"`
  247. PackageID cdssdk.PackageID `form:"packageID" json:"packageID" binding:"required"`
  248. }
  249. type ObjectGetPackageObjectsResp struct {
  250. Objects []cdssdk.Object `json:"objects"`
  251. }
  252. func (c *ObjectService) GetPackageObjects(req ObjectGetPackageObjects) (*ObjectGetPackageObjectsResp, error) {
  253. url, err := url.JoinPath(c.baseURL, ObjectGetPackageObjectsPath)
  254. if err != nil {
  255. return nil, err
  256. }
  257. resp, err := http2.GetForm(url, http2.RequestParam{
  258. Query: req,
  259. })
  260. if err != nil {
  261. return nil, err
  262. }
  263. jsonResp, err := ParseJSONResponse[response[ObjectGetPackageObjectsResp]](resp)
  264. if err != nil {
  265. return nil, err
  266. }
  267. if jsonResp.Code == errorcode.OK {
  268. return &jsonResp.Data, nil
  269. }
  270. return nil, jsonResp.ToError()
  271. }