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.1 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
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. "github.com/gin-gonic/gin"
  6. "gitlink.org.cn/cloudream/common/consts/errorcode"
  7. "gitlink.org.cn/cloudream/common/pkgs/iterator"
  8. "gitlink.org.cn/cloudream/common/pkgs/logger"
  9. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  10. "gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
  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. // PackageGetReq 包含获取包信息请求所需的参数。
  24. type PackageGetReq struct {
  25. UserID *cdssdk.UserID `form:"userID" binding:"required"`
  26. PackageID *cdssdk.PackageID `form:"packageID" binding:"required"`
  27. }
  28. // PackageGetResp 包含获取包信息响应的结果。
  29. type PackageGetResp struct {
  30. model.Package
  31. }
  32. // Get 处理获取包信息的HTTP请求。
  33. func (s *PackageService) Get(ctx *gin.Context) {
  34. log := logger.WithField("HTTP", "Package.Get")
  35. var req PackageGetReq
  36. if err := ctx.ShouldBindQuery(&req); err != nil {
  37. log.Warnf("binding body: %s", err.Error())
  38. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  39. return
  40. }
  41. pkg, err := s.svc.PackageSvc().Get(*req.UserID, *req.PackageID)
  42. if err != nil {
  43. log.Warnf("getting package: %s", err.Error())
  44. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package failed"))
  45. return
  46. }
  47. ctx.JSON(http.StatusOK, OK(PackageGetResp{Package: *pkg}))
  48. }
  49. // Create 处理创建新包的HTTP请求。
  50. func (s *PackageService) Create(ctx *gin.Context) {
  51. log := logger.WithField("HTTP", "Package.Create")
  52. var req cdssdk.PackageCreateReq
  53. if err := ctx.ShouldBindJSON(&req); err != nil {
  54. log.Warnf("binding body: %s", err.Error())
  55. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  56. return
  57. }
  58. pkgID, err := s.svc.PackageSvc().Create(req.UserID, req.BucketID, req.Name)
  59. if err != nil {
  60. log.Warnf("creating package: %s", err.Error())
  61. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "create package failed"))
  62. return
  63. }
  64. ctx.JSON(http.StatusOK, OK(cdssdk.PackageCreateResp{
  65. PackageID: pkgID,
  66. }))
  67. }
  68. // PackageDeleteReq 包含删除包请求所需的参数。
  69. type PackageDeleteReq struct {
  70. UserID *cdssdk.UserID `json:"userID" binding:"required"`
  71. PackageID *cdssdk.PackageID `json:"packageID" binding:"required"`
  72. }
  73. // Delete 处理删除包的HTTP请求。
  74. func (s *PackageService) Delete(ctx *gin.Context) {
  75. log := logger.WithField("HTTP", "Package.Delete")
  76. var req PackageDeleteReq
  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. // GetCachedNodesReq 包含获取缓存节点请求所需的参数。
  91. type GetCachedNodesReq struct {
  92. UserID *cdssdk.UserID `json:"userID" binding:"required"`
  93. PackageID *cdssdk.PackageID `json:"packageID" binding:"required"`
  94. }
  95. // GetCachedNodesResp 包含获取缓存节点响应的结果。
  96. type GetCachedNodesResp struct {
  97. cdssdk.PackageCachingInfo
  98. }
  99. // GetCachedNodes 处理获取包的缓存节点的HTTP请求。
  100. func (s *PackageService) GetCachedNodes(ctx *gin.Context) {
  101. log := logger.WithField("HTTP", "Package.GetCachedNodes")
  102. var req GetCachedNodesReq
  103. if err := ctx.ShouldBindJSON(&req); err != nil {
  104. log.Warnf("binding body: %s", err.Error())
  105. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  106. return
  107. }
  108. resp, err := s.svc.PackageSvc().GetCachedNodes(*req.UserID, *req.PackageID)
  109. if err != nil {
  110. log.Warnf("get package cached nodes failed: %s", err.Error())
  111. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package cached nodes failed"))
  112. return
  113. }
  114. ctx.JSON(http.StatusOK, OK(GetCachedNodesResp{resp}))
  115. }
  116. // GetLoadedNodesReq 包含获取加载节点请求所需的参数。
  117. type GetLoadedNodesReq struct {
  118. UserID *cdssdk.UserID `json:"userID" binding:"required"`
  119. PackageID *cdssdk.PackageID `json:"packageID" binding:"required"`
  120. }
  121. // GetLoadedNodesResp 包含获取加载节点响应的结果。
  122. type GetLoadedNodesResp struct {
  123. NodeIDs []cdssdk.NodeID `json:"nodeIDs"`
  124. }
  125. // GetLoadedNodes 处理获取包的加载节点的HTTP请求。
  126. func (s *PackageService) GetLoadedNodes(ctx *gin.Context) {
  127. log := logger.WithField("HTTP", "Package.GetLoadedNodes")
  128. var req GetLoadedNodesReq
  129. if err := ctx.ShouldBindJSON(&req); err != nil {
  130. log.Warnf("binding body: %s", err.Error())
  131. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  132. return
  133. }
  134. nodeIDs, err := s.svc.PackageSvc().GetLoadedNodes(*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(GetLoadedNodesResp{
  141. NodeIDs: nodeIDs,
  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. return &stgiter.IterUploadingObject{
  154. Path: file.Filename,
  155. Size: file.Size,
  156. File: stream,
  157. }, nil
  158. },
  159. )
  160. }

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