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

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package db
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "github.com/jmoiron/sqlx"
  7. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  8. "gitlink.org.cn/cloudream/storage/common/pkgs/db/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 := sqlx.Get(ctx, &ret, "select * from Bucket where BucketID = ?", bucketID)
  19. return ret, err
  20. }
  21. // GetIDByName 根据BucketName查询BucketID
  22. func (db *BucketDB) GetIDByName(bucketName string) (int64, error) {
  23. //桶结构体
  24. var result struct {
  25. BucketID int64 `db:"BucketID"`
  26. BucketName string `db:"BucketName"`
  27. }
  28. sql := "select BucketID, BucketName from Bucket where BucketName=? "
  29. if err := db.d.Get(&result, sql, bucketName); err != nil {
  30. return 0, err
  31. }
  32. return result.BucketID, nil
  33. }
  34. // IsAvailable 判断用户是否有指定Bucekt的权限
  35. func (db *BucketDB) IsAvailable(ctx SQLContext, bucketID cdssdk.BucketID, userID cdssdk.UserID) (bool, error) {
  36. _, err := db.GetUserBucket(ctx, userID, bucketID)
  37. if errors.Is(err, sql.ErrNoRows) {
  38. return false, nil
  39. }
  40. if err != nil {
  41. return false, fmt.Errorf("find bucket failed, err: %w", err)
  42. }
  43. return true, nil
  44. }
  45. func (*BucketDB) GetUserBucket(ctx SQLContext, userID cdssdk.UserID, bucketID cdssdk.BucketID) (model.Bucket, error) {
  46. var ret model.Bucket
  47. err := sqlx.Get(ctx, &ret,
  48. "select Bucket.* from UserBucket, Bucket where UserID = ? and"+
  49. " UserBucket.BucketID = Bucket.BucketID and"+
  50. " Bucket.BucketID = ?", userID, bucketID)
  51. return ret, err
  52. }
  53. func (*BucketDB) GetUserBucketByName(ctx SQLContext, userID cdssdk.UserID, bucketName string) (model.Bucket, error) {
  54. var ret model.Bucket
  55. err := sqlx.Get(ctx, &ret,
  56. "select Bucket.* from UserBucket, Bucket where UserID = ? and"+
  57. " UserBucket.BucketID = Bucket.BucketID and"+
  58. " Bucket.Name = ?", userID, bucketName)
  59. return ret, err
  60. }
  61. func (*BucketDB) GetUserBuckets(ctx SQLContext, userID cdssdk.UserID) ([]model.Bucket, error) {
  62. var ret []model.Bucket
  63. err := sqlx.Select(ctx, &ret, "select Bucket.* from UserBucket, Bucket where UserID = ? and UserBucket.BucketID = Bucket.BucketID", userID)
  64. return ret, err
  65. }
  66. func (db *BucketDB) Create(ctx SQLContext, userID cdssdk.UserID, bucketName string) (cdssdk.BucketID, error) {
  67. var bucketID int64
  68. err := sqlx.Get(ctx, &bucketID, "select Bucket.BucketID from UserBucket, Bucket where UserBucket.UserID = ? and UserBucket.BucketID = Bucket.BucketID and Bucket.Name = ?", userID, bucketName)
  69. if err == nil {
  70. return 0, fmt.Errorf("bucket name exsits")
  71. }
  72. if err != sql.ErrNoRows {
  73. return 0, err
  74. }
  75. ret, err := ctx.Exec("insert into Bucket(Name,CreatorID) values(?,?)", bucketName, userID)
  76. if err != nil {
  77. return 0, fmt.Errorf("insert bucket failed, err: %w", err)
  78. }
  79. bucketID, err = ret.LastInsertId()
  80. if err != nil {
  81. return 0, fmt.Errorf("get inserted bucket id failed, err: %w", err)
  82. }
  83. _, err = ctx.Exec("insert into UserBucket(UserID,BucketID) values(?,?)", userID, bucketID)
  84. if err != nil {
  85. return 0, fmt.Errorf("insert into user bucket failed, err: %w", err)
  86. }
  87. return cdssdk.BucketID(bucketID), err
  88. }
  89. func (db *BucketDB) Delete(ctx SQLContext, bucketID cdssdk.BucketID) error {
  90. _, err := ctx.Exec("delete from UserBucket where BucketID = ?", bucketID)
  91. if err != nil {
  92. return fmt.Errorf("delete user bucket failed, err: %w", err)
  93. }
  94. _, err = ctx.Exec("delete from Bucket where BucketID = ?", bucketID)
  95. if err != nil {
  96. return fmt.Errorf("delete bucket failed, err: %w", err)
  97. }
  98. // 删除Bucket内的Package
  99. var pkgIDs []cdssdk.PackageID
  100. err = sqlx.Select(ctx, &pkgIDs, "select PackageID from Package where BucketID = ?", bucketID)
  101. if err != nil {
  102. return fmt.Errorf("query package failed, err: %w", err)
  103. }
  104. for _, pkgID := range pkgIDs {
  105. err = db.Package().SoftDelete(ctx, pkgID)
  106. if err != nil {
  107. return fmt.Errorf("set package seleted failed, err: %w", err)
  108. }
  109. // 失败也没关系,会有定时任务再次尝试
  110. db.Package().DeleteUnused(ctx, pkgID)
  111. }
  112. return nil
  113. }

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