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.

bucket.go 4.4 kB

11 months ago
11 months ago
2 years ago
11 months ago
11 months ago
11 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package mq
  2. import (
  3. "errors"
  4. "fmt"
  5. "time"
  6. stgmod "gitlink.org.cn/cloudream/storage/common/models"
  7. "gitlink.org.cn/cloudream/storage/common/pkgs/db2"
  8. "gorm.io/gorm"
  9. "gitlink.org.cn/cloudream/common/consts/errorcode"
  10. "gitlink.org.cn/cloudream/common/pkgs/logger"
  11. "gitlink.org.cn/cloudream/common/pkgs/mq"
  12. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  13. "gitlink.org.cn/cloudream/storage/common/pkgs/db2/model"
  14. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  15. )
  16. func (svc *Service) GetBucket(userID cdssdk.UserID, bucketID cdssdk.BucketID) (model.Bucket, error) {
  17. // TODO
  18. panic("not implement yet")
  19. }
  20. func (svc *Service) GetBucketByName(msg *coormq.GetBucketByName) (*coormq.GetBucketByNameResp, *mq.CodeMessage) {
  21. bucket, err := svc.db2.Bucket().GetUserBucketByName(svc.db2.DefCtx(), msg.UserID, msg.Name)
  22. if err != nil {
  23. logger.WithField("UserID", msg.UserID).
  24. WithField("Name", msg.Name).
  25. Warnf("getting bucket by name: %s", err.Error())
  26. if errors.Is(err, gorm.ErrRecordNotFound) {
  27. return nil, mq.Failed(errorcode.DataNotFound, "bucket not found")
  28. }
  29. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  30. }
  31. return mq.ReplyOK(coormq.RespGetBucketByName(bucket))
  32. }
  33. func (svc *Service) GetUserBuckets(msg *coormq.GetUserBuckets) (*coormq.GetUserBucketsResp, *mq.CodeMessage) {
  34. buckets, err := svc.db2.Bucket().GetUserBuckets(svc.db2.DefCtx(), msg.UserID)
  35. if err != nil {
  36. logger.WithField("UserID", msg.UserID).
  37. Warnf("get user buckets failed, err: %s", err.Error())
  38. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  39. }
  40. return mq.ReplyOK(coormq.NewGetUserBucketsResp(buckets))
  41. }
  42. func (svc *Service) GetBucketPackages(msg *coormq.GetBucketPackages) (*coormq.GetBucketPackagesResp, *mq.CodeMessage) {
  43. packages, err := svc.db2.Package().GetUserBucketPackages(svc.db2.DefCtx(), msg.UserID, msg.BucketID)
  44. if err != nil {
  45. logger.WithField("UserID", msg.UserID).
  46. WithField("BucketID", msg.BucketID).
  47. Warnf("get bucket packages failed, err: %s", err.Error())
  48. return nil, mq.Failed(errorcode.OperationFailed, "get bucket packages failed")
  49. }
  50. return mq.ReplyOK(coormq.NewGetBucketPackagesResp(packages))
  51. }
  52. func (svc *Service) CreateBucket(msg *coormq.CreateBucket) (*coormq.CreateBucketResp, *mq.CodeMessage) {
  53. var bucket cdssdk.Bucket
  54. err := svc.db2.DoTx(func(tx db2.SQLContext) error {
  55. _, err := svc.db2.User().GetByID(tx, msg.UserID)
  56. if err != nil {
  57. return fmt.Errorf("getting user by id: %w", err)
  58. }
  59. bucket, err = svc.db2.Bucket().Create(tx, msg.UserID, msg.BucketName, time.Now())
  60. if err != nil {
  61. return fmt.Errorf("creating bucket: %w", err)
  62. }
  63. return nil
  64. })
  65. if err != nil {
  66. logger.WithField("UserID", msg.UserID).
  67. WithField("BucketName", msg.BucketName).
  68. Warn(err.Error())
  69. if errors.Is(err, gorm.ErrDuplicatedKey) {
  70. return nil, mq.Failed(errorcode.DataExists, "bucket name already exists")
  71. }
  72. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  73. }
  74. svc.evtPub.Publish(&stgmod.BodyNewBucket{
  75. Info: bucket,
  76. })
  77. return mq.ReplyOK(coormq.NewCreateBucketResp(bucket))
  78. }
  79. func (svc *Service) DeleteBucket(msg *coormq.DeleteBucket) (*coormq.DeleteBucketResp, *mq.CodeMessage) {
  80. err := svc.db2.DoTx(func(tx db2.SQLContext) error {
  81. isAvai, _ := svc.db2.Bucket().IsAvailable(tx, msg.BucketID, msg.UserID)
  82. if !isAvai {
  83. return fmt.Errorf("bucket is not avaiable to the user")
  84. }
  85. if err := svc.db2.UserBucket().DeleteByBucketID(tx, msg.BucketID); err != nil {
  86. return fmt.Errorf("deleting user bucket: %w", err)
  87. }
  88. pkgs, err := svc.db2.Package().GetBucketPackages(tx, msg.BucketID)
  89. if err != nil {
  90. return fmt.Errorf("getting bucket packages: %w", err)
  91. }
  92. for _, pkg := range pkgs {
  93. err := svc.db2.Package().DeleteComplete(tx, pkg.PackageID)
  94. if err != nil {
  95. return fmt.Errorf("deleting package %v: %w", pkg.PackageID, err)
  96. }
  97. }
  98. err = svc.db2.Bucket().Delete(tx, msg.BucketID)
  99. if err != nil {
  100. return fmt.Errorf("deleting bucket: %w", err)
  101. }
  102. return nil
  103. })
  104. if err != nil {
  105. logger.WithField("UserID", msg.UserID).
  106. WithField("BucketID", msg.BucketID).
  107. Warn(err.Error())
  108. return nil, mq.Failed(errorcode.OperationFailed, "delete bucket failed")
  109. }
  110. svc.evtPub.Publish(&stgmod.BodyBucketDeleted{
  111. BucketID: msg.BucketID,
  112. })
  113. return mq.ReplyOK(coormq.NewDeleteBucketResp())
  114. }

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