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

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