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

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

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