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

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  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. PartSize int64 `form:"partSize" json:"partSize,omitempty"`
  86. }
  87. type DownloadingObject struct {
  88. Path string
  89. File io.ReadCloser
  90. }
  91. func (c *ObjectService) Download(req ObjectDownload) (*DownloadingObject, error) {
  92. url, err := url.JoinPath(c.baseURL, ObjectDownloadPath)
  93. if err != nil {
  94. return nil, err
  95. }
  96. resp, err := myhttp.GetJSON(url, myhttp.RequestParam{
  97. Query: req,
  98. })
  99. if err != nil {
  100. return nil, err
  101. }
  102. contType := resp.Header.Get("Content-Type")
  103. if strings.Contains(contType, myhttp.ContentTypeJSON) {
  104. var codeResp response[any]
  105. if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil {
  106. return nil, fmt.Errorf("parsing response: %w", err)
  107. }
  108. return nil, codeResp.ToError()
  109. }
  110. _, files, err := myhttp.ParseMultiPartResponse(resp)
  111. if err != nil {
  112. return nil, err
  113. }
  114. file, err := files.MoveNext()
  115. if err == iterator.ErrNoMoreItem {
  116. return nil, fmt.Errorf("no file found in response")
  117. }
  118. if err != nil {
  119. return nil, err
  120. }
  121. return &DownloadingObject{
  122. Path: file.FileName,
  123. File: file.File,
  124. }, nil
  125. }
  126. const ObjectUpdateInfoPath = "/object/updateInfo"
  127. type UpdatingObject struct {
  128. ObjectID ObjectID `json:"objectID" binding:"required"`
  129. UpdateTime time.Time `json:"updateTime" binding:"required"`
  130. }
  131. func (u *UpdatingObject) ApplyTo(obj *Object) {
  132. obj.UpdateTime = u.UpdateTime
  133. }
  134. type ObjectUpdateInfo struct {
  135. UserID UserID `json:"userID" binding:"required"`
  136. Updatings []UpdatingObject `json:"updatings" binding:"required"`
  137. }
  138. type ObjectUpdateInfoResp struct {
  139. Successes []ObjectID `json:"successes"`
  140. }
  141. func (c *ObjectService) UpdateInfo(req ObjectUpdateInfo) (*ObjectUpdateInfoResp, error) {
  142. url, err := url.JoinPath(c.baseURL, ObjectUpdateInfoPath)
  143. if err != nil {
  144. return nil, err
  145. }
  146. resp, err := myhttp.PostJSON(url, myhttp.RequestParam{
  147. Body: req,
  148. })
  149. if err != nil {
  150. return nil, err
  151. }
  152. jsonResp, err := ParseJSONResponse[response[ObjectUpdateInfoResp]](resp)
  153. if err != nil {
  154. return nil, err
  155. }
  156. if jsonResp.Code == errorcode.OK {
  157. return &jsonResp.Data, nil
  158. }
  159. return nil, jsonResp.ToError()
  160. }
  161. const ObjectMovePath = "/object/move"
  162. type MovingObject struct {
  163. ObjectID ObjectID `json:"objectID" binding:"required"`
  164. PackageID PackageID `json:"packageID" binding:"required"`
  165. Path string `json:"path" binding:"required"`
  166. }
  167. func (m *MovingObject) ApplyTo(obj *Object) {
  168. obj.PackageID = m.PackageID
  169. obj.Path = m.Path
  170. }
  171. type ObjectMove struct {
  172. UserID UserID `json:"userID" binding:"required"`
  173. Movings []MovingObject `json:"movings" binding:"required"`
  174. }
  175. type ObjectMoveResp struct {
  176. Successes []ObjectID `json:"successes"`
  177. }
  178. func (c *ObjectService) Move(req ObjectMove) (*ObjectMoveResp, error) {
  179. url, err := url.JoinPath(c.baseURL, ObjectMovePath)
  180. if err != nil {
  181. return nil, err
  182. }
  183. resp, err := myhttp.PostJSON(url, myhttp.RequestParam{
  184. Body: req,
  185. })
  186. if err != nil {
  187. return nil, err
  188. }
  189. jsonResp, err := ParseJSONResponse[response[ObjectMoveResp]](resp)
  190. if err != nil {
  191. return nil, err
  192. }
  193. if jsonResp.Code == errorcode.OK {
  194. return &jsonResp.Data, nil
  195. }
  196. return nil, jsonResp.ToError()
  197. }
  198. const ObjectDeletePath = "/object/delete"
  199. type ObjectDelete struct {
  200. UserID UserID `json:"userID" binding:"required"`
  201. ObjectIDs []ObjectID `json:"objectIDs" binding:"required"`
  202. }
  203. type ObjectDeleteResp struct{}
  204. func (c *ObjectService) Delete(req ObjectDelete) error {
  205. url, err := url.JoinPath(c.baseURL, ObjectDeletePath)
  206. if err != nil {
  207. return err
  208. }
  209. resp, err := myhttp.PostJSON(url, myhttp.RequestParam{
  210. Body: req,
  211. })
  212. if err != nil {
  213. return err
  214. }
  215. jsonResp, err := ParseJSONResponse[response[ObjectDeleteResp]](resp)
  216. if err != nil {
  217. return err
  218. }
  219. if jsonResp.Code == errorcode.OK {
  220. return nil
  221. }
  222. return jsonResp.ToError()
  223. }
  224. const ObjectGetPackageObjectsPath = "/object/getPackageObjects"
  225. type ObjectGetPackageObjects struct {
  226. UserID UserID `form:"userID" json:"userID" binding:"required"`
  227. PackageID PackageID `form:"packageID" json:"packageID" binding:"required"`
  228. }
  229. type ObjectGetPackageObjectsResp struct {
  230. Objects []Object `json:"objects"`
  231. }
  232. func (c *ObjectService) GetPackageObjects(req ObjectGetPackageObjects) (*ObjectGetPackageObjectsResp, error) {
  233. url, err := url.JoinPath(c.baseURL, ObjectGetPackageObjectsPath)
  234. if err != nil {
  235. return nil, err
  236. }
  237. resp, err := myhttp.GetForm(url, myhttp.RequestParam{
  238. Query: req,
  239. })
  240. if err != nil {
  241. return nil, err
  242. }
  243. jsonResp, err := ParseJSONResponse[response[ObjectGetPackageObjectsResp]](resp)
  244. if err != nil {
  245. return nil, err
  246. }
  247. if jsonResp.Code == errorcode.OK {
  248. return &jsonResp.Data, nil
  249. }
  250. return nil, jsonResp.ToError()
  251. }