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

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package services
  2. import (
  3. "fmt"
  4. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  5. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  6. "gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
  7. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  8. )
  9. // BucketService 是对存储桶进行操作的服务类
  10. type BucketService struct {
  11. *Service
  12. }
  13. // BucketSvc 创建并返回一个BucketService实例
  14. func (svc *Service) BucketSvc() *BucketService {
  15. return &BucketService{Service: svc}
  16. }
  17. // GetBucket 根据用户ID和桶ID获取桶信息
  18. // userID: 用户的唯一标识
  19. // bucketID: 桶的唯一标识
  20. // 返回值: 桶的信息和可能发生的错误
  21. func (svc *BucketService) GetBucket(userID cdssdk.UserID, bucketID cdssdk.BucketID) (model.Bucket, error) {
  22. // TODO: 此函数尚未实现
  23. panic("not implement yet")
  24. }
  25. func (svc *BucketService) GetBucketByName(userID cdssdk.UserID, bucketName string) (model.Bucket, error) {
  26. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  27. if err != nil {
  28. return model.Bucket{}, fmt.Errorf("new coordinator client: %w", err)
  29. }
  30. defer stgglb.CoordinatorMQPool.Release(coorCli)
  31. resp, err := coorCli.GetBucketByName(coormq.ReqGetBucketByName(userID, bucketName))
  32. if err != nil {
  33. return model.Bucket{}, fmt.Errorf("get bucket by name failed, err: %w", err)
  34. }
  35. return resp.Bucket, nil
  36. }
  37. func (svc *BucketService) GetUserBuckets(userID cdssdk.UserID) ([]model.Bucket, error) {
  38. // 从CoordinatorMQPool中获取Coordinator客户端
  39. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  40. if err != nil {
  41. return nil, fmt.Errorf("new coordinator client: %w", err)
  42. }
  43. defer stgglb.CoordinatorMQPool.Release(coorCli) // 确保客户端被释放
  44. // 向Coordinator发送请求获取用户桶信息
  45. resp, err := coorCli.GetUserBuckets(coormq.NewGetUserBuckets(userID))
  46. if err != nil {
  47. return nil, fmt.Errorf("get user buckets failed, err: %w", err)
  48. }
  49. return resp.Buckets, nil
  50. }
  51. // GetBucketPackages 获取指定用户和桶的所有包
  52. // userID: 用户的唯一标识
  53. // bucketID: 桶的唯一标识
  54. // 返回值: 桶的所有包列表和可能发生的错误
  55. func (svc *BucketService) GetBucketPackages(userID cdssdk.UserID, bucketID cdssdk.BucketID) ([]model.Package, error) {
  56. // 获取Coordinator客户端
  57. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  58. if err != nil {
  59. return nil, fmt.Errorf("new coordinator client: %w", err)
  60. }
  61. defer stgglb.CoordinatorMQPool.Release(coorCli) // 确保客户端被释放
  62. // 请求Coordinator获取指定桶的包信息
  63. resp, err := coorCli.GetBucketPackages(coormq.NewGetBucketPackages(userID, bucketID))
  64. if err != nil {
  65. return nil, fmt.Errorf("get bucket packages failed, err: %w", err)
  66. }
  67. return resp.Packages, nil
  68. }
  69. func (svc *BucketService) CreateBucket(userID cdssdk.UserID, bucketName string) (cdssdk.Bucket, error) {
  70. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  71. if err != nil {
  72. return cdssdk.Bucket{}, fmt.Errorf("new coordinator client: %w", err)
  73. }
  74. defer stgglb.CoordinatorMQPool.Release(coorCli) // 确保客户端被释放
  75. // 请求Coordinator创建新桶
  76. resp, err := coorCli.CreateBucket(coormq.NewCreateBucket(userID, bucketName))
  77. if err != nil {
  78. return cdssdk.Bucket{}, fmt.Errorf("creating bucket: %w", err)
  79. }
  80. return resp.Bucket, nil
  81. }
  82. // DeleteBucket 删除指定的桶
  83. // userID: 用户的唯一标识
  84. // bucketID: 桶的唯一标识
  85. // 返回值: 可能发生的错误
  86. func (svc *BucketService) DeleteBucket(userID cdssdk.UserID, bucketID cdssdk.BucketID) error {
  87. // 获取Coordinator客户端
  88. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  89. if err != nil {
  90. return fmt.Errorf("new coordinator client: %w", err)
  91. }
  92. defer stgglb.CoordinatorMQPool.Release(coorCli) // 确保客户端被释放
  93. _, err = coorCli.DeleteBucket(coormq.NewDeleteBucket(userID, bucketID))
  94. if err != nil {
  95. return fmt.Errorf("request to coordinator failed, err: %w", err)
  96. }
  97. return nil
  98. }

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