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

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