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

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

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