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

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

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