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

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. // GetUserBuckets 获取指定用户的所有桶信息
  26. // userID: 用户的唯一标识
  27. // 返回值: 用户的所有桶信息列表和可能发生的错误
  28. func (svc *BucketService) GetUserBuckets(userID cdssdk.UserID) ([]model.Bucket, error) {
  29. // 从CoordinatorMQPool中获取Coordinator客户端
  30. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  31. if err != nil {
  32. return nil, fmt.Errorf("new coordinator client: %w", err)
  33. }
  34. defer stgglb.CoordinatorMQPool.Release(coorCli) // 确保客户端被释放
  35. // 向Coordinator发送请求获取用户桶信息
  36. resp, err := coorCli.GetUserBuckets(coormq.NewGetUserBuckets(userID))
  37. if err != nil {
  38. return nil, fmt.Errorf("get user buckets failed, err: %w", err)
  39. }
  40. return resp.Buckets, nil
  41. }
  42. // GetBucketPackages 获取指定用户和桶的所有包
  43. // userID: 用户的唯一标识
  44. // bucketID: 桶的唯一标识
  45. // 返回值: 桶的所有包列表和可能发生的错误
  46. func (svc *BucketService) GetBucketPackages(userID cdssdk.UserID, bucketID cdssdk.BucketID) ([]model.Package, error) {
  47. // 获取Coordinator客户端
  48. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  49. if err != nil {
  50. return nil, fmt.Errorf("new coordinator client: %w", err)
  51. }
  52. defer stgglb.CoordinatorMQPool.Release(coorCli) // 确保客户端被释放
  53. // 请求Coordinator获取指定桶的包信息
  54. resp, err := coorCli.GetBucketPackages(coormq.NewGetBucketPackages(userID, bucketID))
  55. if err != nil {
  56. return nil, fmt.Errorf("get bucket packages failed, err: %w", err)
  57. }
  58. return resp.Packages, nil
  59. }
  60. // CreateBucket 创建一个新的桶
  61. // userID: 用户的唯一标识
  62. // bucketName: 桶的名称
  63. // 返回值: 新创建的桶的ID和可能发生的错误
  64. func (svc *BucketService) CreateBucket(userID cdssdk.UserID, bucketName string) (cdssdk.BucketID, error) {
  65. // 获取Coordinator客户端
  66. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  67. if err != nil {
  68. return 0, fmt.Errorf("new coordinator client: %w", err)
  69. }
  70. defer stgglb.CoordinatorMQPool.Release(coorCli) // 确保客户端被释放
  71. // 请求Coordinator创建新桶
  72. resp, err := coorCli.CreateBucket(coormq.NewCreateBucket(userID, bucketName))
  73. if err != nil {
  74. return 0, fmt.Errorf("creating bucket: %w", err)
  75. }
  76. return resp.BucketID, nil
  77. }
  78. // DeleteBucket 删除指定的桶
  79. // userID: 用户的唯一标识
  80. // bucketID: 桶的唯一标识
  81. // 返回值: 可能发生的错误
  82. func (svc *BucketService) DeleteBucket(userID cdssdk.UserID, bucketID cdssdk.BucketID) error {
  83. // 获取Coordinator客户端
  84. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  85. if err != nil {
  86. return fmt.Errorf("new coordinator client: %w", err)
  87. }
  88. defer stgglb.CoordinatorMQPool.Release(coorCli) // 确保客户端被释放
  89. // TODO: 检查用户是否有删除这个Bucket的权限。检查的时候可以只上UserBucket的Read锁
  90. _, err = coorCli.DeleteBucket(coormq.NewDeleteBucket(userID, bucketID))
  91. if err != nil {
  92. return fmt.Errorf("request to coordinator failed, err: %w", err)
  93. }
  94. return nil
  95. }

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