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 5.9 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
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  11. stgiter "gitlink.org.cn/cloudream/storage/common/pkgs/iterator"
  12. )
  13. type PackageService struct {
  14. *Server
  15. }
  16. func (s *Server) Package() *PackageService {
  17. return &PackageService{
  18. Server: s,
  19. }
  20. }
  21. func (s *PackageService) Get(ctx *gin.Context) {
  22. log := logger.WithField("HTTP", "Package.Get")
  23. var req cdssdk.PackageGetReq
  24. if err := ctx.ShouldBindQuery(&req); err != nil {
  25. log.Warnf("binding body: %s", err.Error())
  26. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  27. return
  28. }
  29. pkg, err := s.svc.PackageSvc().Get(req.UserID, req.PackageID)
  30. if err != nil {
  31. log.Warnf("getting package: %s", err.Error())
  32. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package failed"))
  33. return
  34. }
  35. ctx.JSON(http.StatusOK, OK(cdssdk.PackageGetResp{Package: *pkg}))
  36. }
  37. func (s *PackageService) GetByName(ctx *gin.Context) {
  38. log := logger.WithField("HTTP", "Package.GetByName")
  39. var req cdssdk.PackageGetByName
  40. if err := ctx.ShouldBindQuery(&req); err != nil {
  41. log.Warnf("binding query: %s", err.Error())
  42. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  43. return
  44. }
  45. pkg, err := s.svc.PackageSvc().GetByName(req.UserID, req.BucketName, req.PackageName)
  46. if err != nil {
  47. log.Warnf("getting package by name: %s", err.Error())
  48. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package by name failed"))
  49. return
  50. }
  51. ctx.JSON(http.StatusOK, OK(cdssdk.PackageGetByNameResp{Package: *pkg}))
  52. }
  53. func (s *PackageService) Create(ctx *gin.Context) {
  54. log := logger.WithField("HTTP", "Package.Create")
  55. var req cdssdk.PackageCreate
  56. if err := ctx.ShouldBindJSON(&req); err != nil {
  57. log.Warnf("binding body: %s", err.Error())
  58. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  59. return
  60. }
  61. pkg, err := s.svc.PackageSvc().Create(req.UserID, req.BucketID, req.Name)
  62. if err != nil {
  63. log.Warnf("creating package: %s", err.Error())
  64. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "create package failed"))
  65. return
  66. }
  67. ctx.JSON(http.StatusOK, OK(cdssdk.PackageCreateResp{
  68. Package: pkg,
  69. }))
  70. }
  71. func (s *PackageService) Delete(ctx *gin.Context) {
  72. log := logger.WithField("HTTP", "Package.Delete")
  73. var req cdssdk.PackageDelete
  74. if err := ctx.ShouldBindJSON(&req); err != nil {
  75. log.Warnf("binding body: %s", err.Error())
  76. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  77. return
  78. }
  79. err := s.svc.PackageSvc().DeletePackage(req.UserID, req.PackageID)
  80. if err != nil {
  81. log.Warnf("deleting package: %s", err.Error())
  82. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "delete package failed"))
  83. return
  84. }
  85. ctx.JSON(http.StatusOK, OK(nil))
  86. }
  87. func (s *PackageService) ListBucketPackages(ctx *gin.Context) {
  88. log := logger.WithField("HTTP", "Package.ListBucketPackages")
  89. var req cdssdk.PackageListBucketPackages
  90. if err := ctx.ShouldBindQuery(&req); err != nil {
  91. log.Warnf("binding query: %s", err.Error())
  92. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  93. return
  94. }
  95. pkgs, err := s.svc.PackageSvc().GetBucketPackages(req.UserID, req.BucketID)
  96. if err != nil {
  97. log.Warnf("getting bucket packages: %s", err.Error())
  98. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get bucket packages failed"))
  99. return
  100. }
  101. ctx.JSON(http.StatusOK, OK(cdssdk.PackageListBucketPackagesResp{
  102. Packages: pkgs,
  103. }))
  104. }
  105. func (s *PackageService) GetCachedNodes(ctx *gin.Context) {
  106. log := logger.WithField("HTTP", "Package.GetCachedNodes")
  107. var req cdssdk.PackageGetCachedNodesReq
  108. if err := ctx.ShouldBindQuery(&req); err != nil {
  109. log.Warnf("binding query: %s", err.Error())
  110. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  111. return
  112. }
  113. resp, err := s.svc.PackageSvc().GetCachedNodes(req.UserID, req.PackageID)
  114. if err != nil {
  115. log.Warnf("get package cached nodes failed: %s", err.Error())
  116. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package cached nodes failed"))
  117. return
  118. }
  119. ctx.JSON(http.StatusOK, OK(cdssdk.PackageGetCachedNodesResp{PackageCachingInfo: resp}))
  120. }
  121. func (s *PackageService) GetLoadedNodes(ctx *gin.Context) {
  122. log := logger.WithField("HTTP", "Package.GetLoadedNodes")
  123. var req cdssdk.PackageGetLoadedNodesReq
  124. if err := ctx.ShouldBindQuery(&req); err != nil {
  125. log.Warnf("binding query: %s", err.Error())
  126. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  127. return
  128. }
  129. nodeIDs, err := s.svc.PackageSvc().GetLoadedNodes(req.UserID, req.PackageID)
  130. if err != nil {
  131. log.Warnf("get package loaded nodes failed: %s", err.Error())
  132. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package loaded nodes failed"))
  133. return
  134. }
  135. ctx.JSON(http.StatusOK, OK(cdssdk.PackageGetLoadedNodesResp{
  136. NodeIDs: nodeIDs,
  137. }))
  138. }
  139. func mapMultiPartFileToUploadingObject(files []*multipart.FileHeader) stgiter.UploadingObjectIterator {
  140. return iterator.Map[*multipart.FileHeader](
  141. iterator.Array(files...),
  142. func(file *multipart.FileHeader) (*stgiter.IterUploadingObject, error) {
  143. stream, err := file.Open()
  144. if err != nil {
  145. return nil, err
  146. }
  147. fileName, err := url.PathUnescape(file.Filename)
  148. if err != nil {
  149. return nil, err
  150. }
  151. return &stgiter.IterUploadingObject{
  152. Path: fileName,
  153. Size: file.Size,
  154. File: stream,
  155. }, nil
  156. },
  157. )
  158. }

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