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.

storage.go 3.8 kB

1 year ago
1 year ago
1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package http
  2. import (
  3. "fmt"
  4. "net/http"
  5. "path/filepath"
  6. "time"
  7. "github.com/gin-gonic/gin"
  8. "gitlink.org.cn/cloudream/common/consts/errorcode"
  9. "gitlink.org.cn/cloudream/common/pkgs/logger"
  10. "gitlink.org.cn/cloudream/common/sdks/storage/cdsapi"
  11. )
  12. type StorageService struct {
  13. *Server
  14. }
  15. func (s *Server) Storage() *StorageService {
  16. return &StorageService{
  17. Server: s,
  18. }
  19. }
  20. func (s *StorageService) LoadPackage(ctx *gin.Context) {
  21. log := logger.WithField("HTTP", "Storage.LoadPackage")
  22. var req cdsapi.StorageLoadPackageReq
  23. if err := ctx.ShouldBindJSON(&req); err != nil {
  24. log.Warnf("binding body: %s", err.Error())
  25. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  26. return
  27. }
  28. hubID, taskID, err := s.svc.StorageSvc().StartStorageLoadPackage(req.UserID, req.PackageID, req.StorageID)
  29. if err != nil {
  30. log.Warnf("start storage load package: %s", err.Error())
  31. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, fmt.Sprintf("start loading: %v", err)))
  32. return
  33. }
  34. for {
  35. complete, ret, err := s.svc.StorageSvc().WaitStorageLoadPackage(hubID, taskID, time.Second*10)
  36. if complete {
  37. if err != nil {
  38. log.Warnf("loading complete with: %s", err.Error())
  39. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, fmt.Sprintf("loading complete with: %v", err)))
  40. return
  41. }
  42. ctx.JSON(http.StatusOK, OK(cdsapi.StorageLoadPackageResp{
  43. FullPath: filepath.Join(ret.RemoteBase, ret.PackagePath),
  44. PackagePath: ret.PackagePath,
  45. LocalBase: ret.LocalBase,
  46. RemoteBase: ret.RemoteBase,
  47. }))
  48. return
  49. }
  50. if err != nil {
  51. log.Warnf("wait loadding: %s", err.Error())
  52. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, fmt.Sprintf("wait loading: %v", err)))
  53. return
  54. }
  55. }
  56. }
  57. func (s *StorageService) CreatePackage(ctx *gin.Context) {
  58. log := logger.WithField("HTTP", "Storage.CreatePackage")
  59. var req cdsapi.StorageCreatePackageReq
  60. if err := ctx.ShouldBindJSON(&req); err != nil {
  61. log.Warnf("binding body: %s", err.Error())
  62. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  63. return
  64. }
  65. hubID, taskID, err := s.svc.StorageSvc().StartStorageCreatePackage(
  66. req.UserID, req.BucketID, req.Name, req.StorageID, req.Path, req.StorageAffinity)
  67. if err != nil {
  68. log.Warnf("start storage create package: %s", err.Error())
  69. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "storage create package failed"))
  70. return
  71. }
  72. for {
  73. complete, packageID, err := s.svc.StorageSvc().WaitStorageCreatePackage(hubID, taskID, time.Second*10)
  74. if complete {
  75. if err != nil {
  76. log.Warnf("creating complete with: %s", err.Error())
  77. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "storage create package failed"))
  78. return
  79. }
  80. ctx.JSON(http.StatusOK, OK(cdsapi.StorageCreatePackageResp{
  81. PackageID: packageID,
  82. }))
  83. return
  84. }
  85. if err != nil {
  86. log.Warnf("wait creating: %s", err.Error())
  87. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "storage create package failed"))
  88. return
  89. }
  90. }
  91. }
  92. func (s *StorageService) Get(ctx *gin.Context) {
  93. log := logger.WithField("HTTP", "Storage.Get")
  94. var req cdsapi.StorageGet
  95. if err := ctx.ShouldBindQuery(&req); err != nil {
  96. log.Warnf("binding query: %s", err.Error())
  97. ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
  98. return
  99. }
  100. info, err := s.svc.StorageSvc().Get(req.UserID, req.StorageID)
  101. if err != nil {
  102. log.Warnf("getting info: %s", err.Error())
  103. ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get storage inf failed"))
  104. return
  105. }
  106. ctx.JSON(http.StatusOK, OK(cdsapi.StorageGetResp{
  107. Storage: *info,
  108. }))
  109. }

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