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 3.8 kB

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

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