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.5 kB

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

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