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

11 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package db2
  2. import (
  3. "errors"
  4. "fmt"
  5. "gorm.io/gorm"
  6. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  7. "gitlink.org.cn/cloudream/storage/common/pkgs/db2/model"
  8. )
  9. type BucketDB struct {
  10. *DB
  11. }
  12. func (db *DB) Bucket() *BucketDB {
  13. return &BucketDB{DB: db}
  14. }
  15. func (db *BucketDB) GetByID(ctx SQLContext, bucketID cdssdk.BucketID) (cdssdk.Bucket, error) {
  16. var ret cdssdk.Bucket
  17. err := ctx.Table("Bucket").Where("BucketID = ?", bucketID).First(&ret).Error
  18. return ret, err
  19. }
  20. // GetIDByName 根据BucketName查询BucketID
  21. func (db *BucketDB) GetIDByName(ctx SQLContext, bucketName string) (int64, error) {
  22. var result struct {
  23. BucketID int64 `gorm:"column:BucketID"`
  24. BucketName string `gorm:"column:BucketName"`
  25. }
  26. err := ctx.Table("Bucket").Select("BucketID, BucketName").Where("BucketName = ?", bucketName).Scan(&result).Error
  27. if err != nil {
  28. return 0, err
  29. }
  30. return result.BucketID, nil
  31. }
  32. // IsAvailable 判断用户是否有指定Bucekt的权限
  33. func (db *BucketDB) IsAvailable(ctx SQLContext, bucketID cdssdk.BucketID, userID cdssdk.UserID) (bool, error) {
  34. _, err := db.GetUserBucket(ctx, userID, bucketID)
  35. if errors.Is(err, gorm.ErrRecordNotFound) {
  36. return false, nil
  37. }
  38. if err != nil {
  39. return false, fmt.Errorf("find bucket failed, err: %w", err)
  40. }
  41. return true, nil
  42. }
  43. func (*BucketDB) GetUserBucket(ctx SQLContext, userID cdssdk.UserID, bucketID cdssdk.BucketID) (model.Bucket, error) {
  44. var ret model.Bucket
  45. err := ctx.Table("UserBucket").
  46. Select("Bucket.*").
  47. Joins("JOIN Bucket ON UserBucket.BucketID = Bucket.BucketID").
  48. Where("UserBucket.UserID = ? AND Bucket.BucketID = ?", userID, bucketID).
  49. First(&ret).Error
  50. return ret, err
  51. }
  52. func (*BucketDB) GetUserBucketByName(ctx SQLContext, userID cdssdk.UserID, bucketName string) (model.Bucket, error) {
  53. var ret model.Bucket
  54. err := ctx.Table("UserBucket").
  55. Select("Bucket.*").
  56. Joins("JOIN Bucket ON UserBucket.BucketID = Bucket.BucketID").
  57. Where("UserBucket.UserID = ? AND Bucket.Name = ?", userID, bucketName).
  58. First(&ret).Error
  59. return ret, err
  60. }
  61. func (*BucketDB) GetUserBuckets(ctx SQLContext, userID cdssdk.UserID) ([]model.Bucket, error) {
  62. var ret []model.Bucket
  63. err := ctx.Table("UserBucket").
  64. Select("Bucket.*").
  65. Joins("JOIN Bucket ON UserBucket.BucketID = Bucket.BucketID").
  66. Where("UserBucket.UserID = ?", userID).
  67. Find(&ret).Error
  68. return ret, err
  69. }
  70. func (db *BucketDB) Create(ctx SQLContext, userID cdssdk.UserID, bucketName string) (cdssdk.BucketID, error) {
  71. var bucketID int64
  72. err := ctx.Table("UserBucket").
  73. Select("Bucket.BucketID").
  74. Joins("JOIN Bucket ON UserBucket.BucketID = Bucket.BucketID").
  75. Where("UserBucket.UserID = ? AND Bucket.Name = ?", userID, bucketName).
  76. Scan(&bucketID).Error
  77. if err != nil {
  78. return 0, err
  79. }
  80. if bucketID > 0 {
  81. return 0, gorm.ErrDuplicatedKey
  82. }
  83. newBucket := cdssdk.Bucket{Name: bucketName, CreatorID: userID}
  84. if err := ctx.Table("Bucket").Create(&newBucket).Error; err != nil {
  85. return 0, fmt.Errorf("insert bucket failed, err: %w", err)
  86. }
  87. err = ctx.Table("UserBucket").Create(&model.UserBucket{UserID: userID, BucketID: newBucket.BucketID}).Error
  88. if err != nil {
  89. return 0, fmt.Errorf("insert user bucket: %w", err)
  90. }
  91. return newBucket.BucketID, nil
  92. }
  93. func (db *BucketDB) Delete(ctx SQLContext, bucketID cdssdk.BucketID) error {
  94. if err := ctx.Exec("DELETE FROM UserBucket WHERE BucketID = ?", bucketID).Error; err != nil {
  95. return fmt.Errorf("delete user bucket failed, err: %w", err)
  96. }
  97. if err := ctx.Exec("DELETE FROM Bucket WHERE BucketID = ?", bucketID).Error; err != nil {
  98. return fmt.Errorf("delete bucket failed, err: %w", err)
  99. }
  100. var pkgIDs []cdssdk.PackageID
  101. if err := ctx.Table("Package").Select("PackageID").Where("BucketID = ?", bucketID).Find(&pkgIDs).Error; err != nil {
  102. return fmt.Errorf("query package failed, err: %w", err)
  103. }
  104. for _, pkgID := range pkgIDs {
  105. if err := db.Package().SoftDelete(ctx, pkgID); err != nil {
  106. return fmt.Errorf("set package selected failed, err: %w", err)
  107. }
  108. // 失败也没关系,会有定时任务再次尝试
  109. db.Package().DeleteUnused(ctx, pkgID)
  110. }
  111. return nil
  112. }

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