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

1 year ago
1 year ago
1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package cdssdk
  2. import (
  3. "fmt"
  4. "io"
  5. "net/url"
  6. "strings"
  7. "gitlink.org.cn/cloudream/common/consts/errorcode"
  8. "gitlink.org.cn/cloudream/common/pkgs/iterator"
  9. myhttp "gitlink.org.cn/cloudream/common/utils/http"
  10. "gitlink.org.cn/cloudream/common/utils/serder"
  11. )
  12. type ObjectService struct {
  13. *Client
  14. }
  15. func (c *Client) Object() *ObjectService {
  16. return &ObjectService{
  17. Client: c,
  18. }
  19. }
  20. const ObjectUploadPath = "/object/upload"
  21. type ObjectUploadReq struct {
  22. ObjectUploadInfo
  23. Files UploadObjectIterator `json:"-"`
  24. }
  25. type ObjectUploadInfo struct {
  26. UserID UserID `json:"userID" binding:"required"`
  27. PackageID PackageID `json:"packageID" binding:"required"`
  28. NodeAffinity *NodeID `json:"nodeAffinity"`
  29. }
  30. type IterObjectUpload struct {
  31. Path string
  32. File io.ReadCloser
  33. }
  34. type UploadObjectIterator = iterator.Iterator[*IterObjectUpload]
  35. type ObjectUploadResp struct{}
  36. func (c *ObjectService) Upload(req ObjectUploadReq) (*ObjectUploadResp, error) {
  37. url, err := url.JoinPath(c.baseURL, ObjectUploadPath)
  38. if err != nil {
  39. return nil, err
  40. }
  41. infoJSON, err := serder.ObjectToJSON(req)
  42. if err != nil {
  43. return nil, fmt.Errorf("upload info to json: %w", err)
  44. }
  45. resp, err := myhttp.PostMultiPart(url, myhttp.MultiPartRequestParam{
  46. Form: map[string]string{"info": string(infoJSON)},
  47. Files: iterator.Map(req.Files, func(src *IterObjectUpload) (*myhttp.IterMultiPartFile, error) {
  48. return &myhttp.IterMultiPartFile{
  49. FieldName: "files",
  50. FileName: src.Path,
  51. File: src.File,
  52. }, nil
  53. }),
  54. })
  55. if err != nil {
  56. return nil, err
  57. }
  58. contType := resp.Header.Get("Content-Type")
  59. if strings.Contains(contType, myhttp.ContentTypeJSON) {
  60. var codeResp response[ObjectUploadResp]
  61. if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil {
  62. return nil, fmt.Errorf("parsing response: %w", err)
  63. }
  64. if codeResp.Code == errorcode.OK {
  65. return &codeResp.Data, nil
  66. }
  67. return nil, codeResp.ToError()
  68. }
  69. return nil, fmt.Errorf("unknow response content type: %s", contType)
  70. }
  71. const ObjectDownloadPath = "/object/download"
  72. type ObjectDownloadReq struct {
  73. UserID int64 `json:"userID"`
  74. ObjectID int64 `json:"objectID"`
  75. }
  76. func (c *ObjectService) Download(req ObjectDownloadReq) (io.ReadCloser, error) {
  77. url, err := url.JoinPath(c.baseURL, ObjectDownloadPath)
  78. if err != nil {
  79. return nil, err
  80. }
  81. resp, err := myhttp.GetJSON(url, myhttp.RequestParam{
  82. Query: req,
  83. })
  84. if err != nil {
  85. return nil, err
  86. }
  87. contType := resp.Header.Get("Content-Type")
  88. if strings.Contains(contType, myhttp.ContentTypeJSON) {
  89. var codeResp response[any]
  90. if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil {
  91. return nil, fmt.Errorf("parsing response: %w", err)
  92. }
  93. return nil, codeResp.ToError()
  94. }
  95. if strings.Contains(contType, myhttp.ContentTypeOctetStream) {
  96. return resp.Body, nil
  97. }
  98. return nil, fmt.Errorf("unknow response content type: %s", contType)
  99. }
  100. const ObjectGetPackageObjectsPath = "/object/getPackageObjects"
  101. type ObjectGetPackageObjectsReq struct {
  102. UserID UserID `json:"userID"`
  103. PackageID PackageID `json:"packageID"`
  104. }
  105. type ObjectGetPackageObjectsResp struct {
  106. Objects []Object `json:"objects"`
  107. }
  108. func (c *ObjectService) GetPackageObjects(req ObjectGetPackageObjectsReq) (*ObjectGetPackageObjectsResp, error) {
  109. url, err := url.JoinPath(c.baseURL, ObjectGetPackageObjectsPath)
  110. if err != nil {
  111. return nil, err
  112. }
  113. resp, err := myhttp.GetForm(url, myhttp.RequestParam{
  114. Query: req,
  115. })
  116. if err != nil {
  117. return nil, err
  118. }
  119. jsonResp, err := myhttp.ParseJSONResponse[response[ObjectGetPackageObjectsResp]](resp)
  120. if err != nil {
  121. return nil, err
  122. }
  123. if jsonResp.Code == errorcode.OK {
  124. return &jsonResp.Data, nil
  125. }
  126. return nil, jsonResp.ToError()
  127. }