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