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.

package.go 6.3 kB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package http
  2. import (
  3. "mime/multipart"
  4. "net/http"
  5. "net/url"
  6. "github.com/gin-gonic/gin"
  7. "gitlink.org.cn/cloudream/common/consts/errorcode"
  8. "gitlink.org.cn/cloudream/common/pkgs/iterator"
  9. "gitlink.org.cn/cloudream/common/pkgs/logger"
  10. "gitlink.org.cn/cloudream/common/sdks/storage/cdsapi"
  11. stgiter "gitlink.org.cn/cloudream/storage/common/pkgs/iterator"
  12. )
  13. // PackageService 包服务,负责处理包相关的HTTP请求。
  14. type PackageService struct {
  15. *Server
  16. }
  17. // Package 返回PackageService的实例。
  18. func (s *Server) Package() *PackageService {
  19. return &PackageService{
  20. Server: s,
  21. }
  22. }
  23. func (s *PackageService) Get(ctx *gin.Context) {
  24. log := logger.WithField("HTTP", "Package.Get")
  25. var req cdsapi.PackageGetReq
  26. if err := ctx.ShouldBindQuery(&req); err != nil {
  27. log.Warnf("binding body: %s", err.Error())
  28. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  29. return
  30. }
  31. pkg, err := s.svc.PackageSvc().Get(req.UserID, req.PackageID)
  32. if err != nil {
  33. log.Warnf("getting package: %s", err.Error())
  34. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package failed"))
  35. return
  36. }
  37. ctx.JSON(http.StatusOK, OK(cdsapi.PackageGetResp{Package: *pkg}))
  38. }
  39. func (s *PackageService) GetByName(ctx *gin.Context) {
  40. log := logger.WithField("HTTP", "Package.GetByName")
  41. var req cdsapi.PackageGetByName
  42. if err := ctx.ShouldBindQuery(&req); err != nil {
  43. log.Warnf("binding query: %s", err.Error())
  44. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  45. return
  46. }
  47. pkg, err := s.svc.PackageSvc().GetByName(req.UserID, req.BucketName, req.PackageName)
  48. if err != nil {
  49. log.Warnf("getting package by name: %s", err.Error())
  50. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package by name failed"))
  51. return
  52. }
  53. ctx.JSON(http.StatusOK, OK(cdsapi.PackageGetByNameResp{Package: *pkg}))
  54. }
  55. // Create 处理创建新包的HTTP请求。
  56. func (s *PackageService) Create(ctx *gin.Context) {
  57. log := logger.WithField("HTTP", "Package.Create")
  58. var req cdsapi.PackageCreate
  59. if err := ctx.ShouldBindJSON(&req); err != nil {
  60. log.Warnf("binding body: %s", err.Error())
  61. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  62. return
  63. }
  64. pkg, err := s.svc.PackageSvc().Create(req.UserID, req.BucketID, req.Name)
  65. if err != nil {
  66. log.Warnf("creating package: %s", err.Error())
  67. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "create package failed"))
  68. return
  69. }
  70. ctx.JSON(http.StatusOK, OK(cdsapi.PackageCreateResp{
  71. Package: pkg,
  72. }))
  73. }
  74. func (s *PackageService) Delete(ctx *gin.Context) {
  75. log := logger.WithField("HTTP", "Package.Delete")
  76. var req cdsapi.PackageDelete
  77. if err := ctx.ShouldBindJSON(&req); err != nil {
  78. log.Warnf("binding body: %s", err.Error())
  79. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  80. return
  81. }
  82. err := s.svc.PackageSvc().DeletePackage(req.UserID, req.PackageID)
  83. if err != nil {
  84. log.Warnf("deleting package: %s", err.Error())
  85. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "delete package failed"))
  86. return
  87. }
  88. ctx.JSON(http.StatusOK, OK(nil))
  89. }
  90. func (s *PackageService) ListBucketPackages(ctx *gin.Context) {
  91. log := logger.WithField("HTTP", "Package.ListBucketPackages")
  92. var req cdsapi.PackageListBucketPackages
  93. if err := ctx.ShouldBindQuery(&req); err != nil {
  94. log.Warnf("binding query: %s", err.Error())
  95. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  96. return
  97. }
  98. pkgs, err := s.svc.PackageSvc().GetBucketPackages(req.UserID, req.BucketID)
  99. if err != nil {
  100. log.Warnf("getting bucket packages: %s", err.Error())
  101. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get bucket packages failed"))
  102. return
  103. }
  104. ctx.JSON(http.StatusOK, OK(cdsapi.PackageListBucketPackagesResp{
  105. Packages: pkgs,
  106. }))
  107. }
  108. // GetCachedStorages 处理获取包的缓存节点的HTTP请求。
  109. func (s *PackageService) GetCachedStorages(ctx *gin.Context) {
  110. log := logger.WithField("HTTP", "Package.GetCachedStorages")
  111. var req cdsapi.PackageGetCachedStoragesReq
  112. if err := ctx.ShouldBindQuery(&req); err != nil {
  113. log.Warnf("binding query: %s", err.Error())
  114. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  115. return
  116. }
  117. resp, err := s.svc.PackageSvc().GetCachedStorages(req.UserID, req.PackageID)
  118. if err != nil {
  119. log.Warnf("get package cached nodes failed: %s", err.Error())
  120. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package cached nodes failed"))
  121. return
  122. }
  123. ctx.JSON(http.StatusOK, OK(cdsapi.PackageGetCachedStoragesResp{PackageCachingInfo: resp}))
  124. }
  125. // GetLoadedStorages 处理获取包的加载节点的HTTP请求。
  126. func (s *PackageService) GetLoadedStorages(ctx *gin.Context) {
  127. log := logger.WithField("HTTP", "Package.GetLoadedStorages")
  128. var req cdsapi.PackageGetLoadedStoragesReq
  129. if err := ctx.ShouldBindQuery(&req); err != nil {
  130. log.Warnf("binding query: %s", err.Error())
  131. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  132. return
  133. }
  134. stgIDs, err := s.svc.PackageSvc().GetLoadedStorages(req.UserID, req.PackageID)
  135. if err != nil {
  136. log.Warnf("get package loaded nodes failed: %s", err.Error())
  137. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package loaded nodes failed"))
  138. return
  139. }
  140. ctx.JSON(http.StatusOK, OK(cdsapi.PackageGetLoadedStoragesResp{
  141. StorageIDs: stgIDs,
  142. }))
  143. }
  144. // mapMultiPartFileToUploadingObject 将multipart文件转换为上传对象的迭代器。
  145. func mapMultiPartFileToUploadingObject(files []*multipart.FileHeader) stgiter.UploadingObjectIterator {
  146. return iterator.Map[*multipart.FileHeader](
  147. iterator.Array(files...),
  148. func(file *multipart.FileHeader) (*stgiter.IterUploadingObject, error) {
  149. stream, err := file.Open()
  150. if err != nil {
  151. return nil, err
  152. }
  153. fileName, err := url.PathUnescape(file.Filename)
  154. if err != nil {
  155. return nil, err
  156. }
  157. return &stgiter.IterUploadingObject{
  158. Path: fileName,
  159. Size: file.Size,
  160. File: stream,
  161. }, nil
  162. },
  163. )
  164. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。