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.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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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. type PackageService struct {
  14. *Server
  15. }
  16. func (s *Server) Package() *PackageService {
  17. return &PackageService{
  18. Server: s,
  19. }
  20. }
  21. type PackageGetReq struct {
  22. UserID *cdssdk.UserID `form:"userID" binding:"required"`
  23. PackageID *cdssdk.PackageID `form:"packageID" binding:"required"`
  24. }
  25. type PackageGetResp struct {
  26. model.Package
  27. }
  28. func (s *PackageService) Get(ctx *gin.Context) {
  29. log := logger.WithField("HTTP", "Package.Get")
  30. var req PackageGetReq
  31. if err := ctx.ShouldBindQuery(&req); err != nil {
  32. log.Warnf("binding body: %s", err.Error())
  33. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  34. return
  35. }
  36. pkg, err := s.svc.PackageSvc().Get(*req.UserID, *req.PackageID)
  37. if err != nil {
  38. log.Warnf("getting package: %s", err.Error())
  39. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package failed"))
  40. return
  41. }
  42. ctx.JSON(http.StatusOK, OK(PackageGetResp{Package: *pkg}))
  43. }
  44. func (s *PackageService) Create(ctx *gin.Context) {
  45. log := logger.WithField("HTTP", "Package.Create")
  46. var req cdssdk.PackageCreateReq
  47. if err := ctx.ShouldBindJSON(&req); err != nil {
  48. log.Warnf("binding body: %s", err.Error())
  49. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  50. return
  51. }
  52. pkgID, err := s.svc.PackageSvc().Create(req.UserID, req.BucketID, req.Name)
  53. if err != nil {
  54. log.Warnf("creating package: %s", err.Error())
  55. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "create package failed"))
  56. return
  57. }
  58. ctx.JSON(http.StatusOK, OK(cdssdk.PackageCreateResp{
  59. PackageID: pkgID,
  60. }))
  61. }
  62. type PackageDeleteReq struct {
  63. UserID *cdssdk.UserID `json:"userID" binding:"required"`
  64. PackageID *cdssdk.PackageID `json:"packageID" binding:"required"`
  65. }
  66. func (s *PackageService) Delete(ctx *gin.Context) {
  67. log := logger.WithField("HTTP", "Package.Delete")
  68. var req PackageDeleteReq
  69. if err := ctx.ShouldBindJSON(&req); err != nil {
  70. log.Warnf("binding body: %s", err.Error())
  71. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  72. return
  73. }
  74. err := s.svc.PackageSvc().DeletePackage(*req.UserID, *req.PackageID)
  75. if err != nil {
  76. log.Warnf("deleting package: %s", err.Error())
  77. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "delete package failed"))
  78. return
  79. }
  80. ctx.JSON(http.StatusOK, OK(nil))
  81. }
  82. type GetCachedNodesReq struct {
  83. UserID *cdssdk.UserID `json:"userID" binding:"required"`
  84. PackageID *cdssdk.PackageID `json:"packageID" binding:"required"`
  85. }
  86. type GetCachedNodesResp struct {
  87. cdssdk.PackageCachingInfo
  88. }
  89. func (s *PackageService) GetCachedNodes(ctx *gin.Context) {
  90. log := logger.WithField("HTTP", "Package.GetCachedNodes")
  91. var req GetCachedNodesReq
  92. if err := ctx.ShouldBindJSON(&req); err != nil {
  93. log.Warnf("binding body: %s", err.Error())
  94. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  95. return
  96. }
  97. resp, err := s.svc.PackageSvc().GetCachedNodes(*req.UserID, *req.PackageID)
  98. if err != nil {
  99. log.Warnf("get package cached nodes failed: %s", err.Error())
  100. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package cached nodes failed"))
  101. return
  102. }
  103. ctx.JSON(http.StatusOK, OK(GetCachedNodesResp{resp}))
  104. }
  105. type GetLoadedNodesReq struct {
  106. UserID *cdssdk.UserID `json:"userID" binding:"required"`
  107. PackageID *cdssdk.PackageID `json:"packageID" binding:"required"`
  108. }
  109. type GetLoadedNodesResp struct {
  110. NodeIDs []cdssdk.NodeID `json:"nodeIDs"`
  111. }
  112. func (s *PackageService) GetLoadedNodes(ctx *gin.Context) {
  113. log := logger.WithField("HTTP", "Package.GetLoadedNodes")
  114. var req GetLoadedNodesReq
  115. if err := ctx.ShouldBindJSON(&req); err != nil {
  116. log.Warnf("binding body: %s", err.Error())
  117. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  118. return
  119. }
  120. nodeIDs, err := s.svc.PackageSvc().GetLoadedNodes(*req.UserID, *req.PackageID)
  121. if err != nil {
  122. log.Warnf("get package loaded nodes failed: %s", err.Error())
  123. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package loaded nodes failed"))
  124. return
  125. }
  126. ctx.JSON(http.StatusOK, OK(GetLoadedNodesResp{
  127. NodeIDs: nodeIDs,
  128. }))
  129. }
  130. func mapMultiPartFileToUploadingObject(files []*multipart.FileHeader) stgiter.UploadingObjectIterator {
  131. return iterator.Map[*multipart.FileHeader](
  132. iterator.Array(files...),
  133. func(file *multipart.FileHeader) (*stgiter.IterUploadingObject, error) {
  134. stream, err := file.Open()
  135. if err != nil {
  136. return nil, err
  137. }
  138. return &stgiter.IterUploadingObject{
  139. Path: file.Filename,
  140. Size: file.Size,
  141. File: stream,
  142. }, nil
  143. },
  144. )
  145. }

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