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.

package.go 6.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package db2
  2. import (
  3. "fmt"
  4. "time"
  5. "gorm.io/gorm"
  6. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  7. "gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
  8. )
  9. type PackageDB struct {
  10. *DB
  11. }
  12. func (db *DB) Package() *PackageDB {
  13. return &PackageDB{DB: db}
  14. }
  15. func (db *PackageDB) GetByID(ctx SQLContext, packageID cdssdk.PackageID) (model.Package, error) {
  16. var ret model.Package
  17. err := ctx.Table("Package").Where("PackageID = ?", packageID).First(&ret).Error
  18. return ret, err
  19. }
  20. func (db *PackageDB) GetByName(ctx SQLContext, bucketID cdssdk.BucketID, name string) (model.Package, error) {
  21. var ret model.Package
  22. err := ctx.Table("Package").Where("BucketID = ? AND Name = ?", bucketID, name).First(&ret).Error
  23. return ret, err
  24. }
  25. func (db *PackageDB) BatchTestPackageID(ctx SQLContext, pkgIDs []cdssdk.PackageID) (map[cdssdk.PackageID]bool, error) {
  26. if len(pkgIDs) == 0 {
  27. return make(map[cdssdk.PackageID]bool), nil
  28. }
  29. var avaiIDs []cdssdk.PackageID
  30. err := ctx.Table("Package").
  31. Select("PackageID").
  32. Where("PackageID IN ?", pkgIDs).
  33. Find(&avaiIDs).Error
  34. if err != nil {
  35. return nil, err
  36. }
  37. avaiIDMap := make(map[cdssdk.PackageID]bool)
  38. for _, pkgID := range avaiIDs {
  39. avaiIDMap[pkgID] = true
  40. }
  41. return avaiIDMap, nil
  42. }
  43. func (*PackageDB) BatchGetAllPackageIDs(ctx SQLContext, start int, count int) ([]cdssdk.PackageID, error) {
  44. var ret []cdssdk.PackageID
  45. err := ctx.Table("Package").Select("PackageID").Limit(count).Offset(start).Find(&ret).Error
  46. return ret, err
  47. }
  48. func (db *PackageDB) GetUserBucketPackages(ctx SQLContext, userID cdssdk.UserID, bucketID cdssdk.BucketID) ([]model.Package, error) {
  49. var ret []model.Package
  50. err := ctx.Table("UserBucket").
  51. Select("Package.*").
  52. Joins("JOIN Package ON UserBucket.BucketID = Package.BucketID").
  53. Where("UserBucket.UserID = ? AND UserBucket.BucketID = ?", userID, bucketID).
  54. Find(&ret).Error
  55. return ret, err
  56. }
  57. func (db *PackageDB) GetBucketPackages(ctx SQLContext, bucketID cdssdk.BucketID) ([]model.Package, error) {
  58. var ret []model.Package
  59. err := ctx.Table("Package").
  60. Select("Package.*").
  61. Where("BucketID = ?", bucketID).
  62. Find(&ret).Error
  63. return ret, err
  64. }
  65. func (db *PackageDB) GetBucketPackagesByName(ctx SQLContext, bucketName string) ([]model.Package, error) {
  66. var ret []model.Package
  67. err := ctx.Table("Package").
  68. Select("Package.*").
  69. Joins("JOIN Bucket ON Package.BucketID = Bucket.BucketID").
  70. Where("Bucket.Name = ?", bucketName).
  71. Find(&ret).Error
  72. return ret, err
  73. }
  74. // IsAvailable 判断一个用户是否拥有指定对象
  75. func (db *PackageDB) IsAvailable(ctx SQLContext, userID cdssdk.UserID, packageID cdssdk.PackageID) (bool, error) {
  76. var pkgID cdssdk.PackageID
  77. err := ctx.Table("Package").
  78. Select("Package.PackageID").
  79. Joins("JOIN UserBucket ON Package.BucketID = UserBucket.BucketID").
  80. Where("Package.PackageID = ? AND UserBucket.UserID = ?", packageID, userID).
  81. Scan(&pkgID).Error
  82. if err == gorm.ErrRecordNotFound {
  83. return false, nil
  84. }
  85. if err != nil {
  86. return false, fmt.Errorf("find package failed, err: %w", err)
  87. }
  88. return true, nil
  89. }
  90. // GetUserPackage 获得Package,如果用户没有权限访问,则不会获得结果
  91. func (db *PackageDB) GetUserPackage(ctx SQLContext, userID cdssdk.UserID, packageID cdssdk.PackageID) (model.Package, error) {
  92. var ret model.Package
  93. err := ctx.Table("Package").
  94. Select("Package.*").
  95. Joins("JOIN UserBucket ON Package.BucketID = UserBucket.BucketID").
  96. Where("Package.PackageID = ? AND UserBucket.UserID = ?", packageID, userID).
  97. First(&ret).Error
  98. return ret, err
  99. }
  100. // 在指定名称的Bucket中查找指定名称的Package
  101. func (*PackageDB) GetUserPackageByName(ctx SQLContext, userID cdssdk.UserID, bucketName string, packageName string) (model.Package, error) {
  102. var ret model.Package
  103. err := ctx.Table("Package").
  104. Select("Package.*").
  105. Joins("JOIN Bucket ON Package.BucketID = Bucket.BucketID").
  106. Joins("JOIN UserBucket ON Bucket.BucketID = UserBucket.BucketID").
  107. Where("Package.Name = ? AND Bucket.Name = ? AND UserBucket.UserID = ?", packageName, bucketName, userID).
  108. First(&ret).Error
  109. return ret, err
  110. }
  111. func (db *PackageDB) Create(ctx SQLContext, bucketID cdssdk.BucketID, name string) (cdssdk.Package, error) {
  112. var packageID int64
  113. err := ctx.Table("Package").
  114. Select("PackageID").
  115. Where("Name = ? AND BucketID = ?", name, bucketID).
  116. Scan(&packageID).Error
  117. if err != nil {
  118. return cdssdk.Package{}, err
  119. }
  120. if packageID != 0 {
  121. return cdssdk.Package{}, gorm.ErrDuplicatedKey
  122. }
  123. newPackage := cdssdk.Package{Name: name, BucketID: bucketID, CreateTime: time.Now(), State: cdssdk.PackageStateNormal}
  124. if err := ctx.Create(&newPackage).Error; err != nil {
  125. return cdssdk.Package{}, fmt.Errorf("insert package failed, err: %w", err)
  126. }
  127. return newPackage, nil
  128. }
  129. func (*PackageDB) Delete(ctx SQLContext, packageID cdssdk.PackageID) error {
  130. err := ctx.Delete(&model.Package{}, "PackageID = ?", packageID).Error
  131. return err
  132. }
  133. // 删除与Package相关的所有数据
  134. func (db *PackageDB) DeleteComplete(ctx SQLContext, packageID cdssdk.PackageID) error {
  135. if err := db.Package().Delete(ctx, packageID); err != nil {
  136. return fmt.Errorf("delete package state: %w", err)
  137. }
  138. if err := db.ObjectAccessStat().DeleteInPackage(ctx, packageID); err != nil {
  139. return fmt.Errorf("delete from object access stat: %w", err)
  140. }
  141. if err := db.ObjectBlock().DeleteInPackage(ctx, packageID); err != nil {
  142. return fmt.Errorf("delete from object block failed, err: %w", err)
  143. }
  144. if err := db.PinnedObject().DeleteInPackage(ctx, packageID); err != nil {
  145. return fmt.Errorf("deleting pinned objects in package: %w", err)
  146. }
  147. if err := db.Object().DeleteInPackage(ctx, packageID); err != nil {
  148. return fmt.Errorf("deleting objects in package: %w", err)
  149. }
  150. if err := db.PackageAccessStat().DeleteByPackageID(ctx, packageID); err != nil {
  151. return fmt.Errorf("deleting package access stat: %w", err)
  152. }
  153. return nil
  154. }
  155. func (*PackageDB) ChangeState(ctx SQLContext, packageID cdssdk.PackageID, state string) error {
  156. err := ctx.Exec("UPDATE Package SET State = ? WHERE PackageID = ?", state, packageID).Error
  157. return err
  158. }
  159. func (*PackageDB) HasPackageIn(ctx SQLContext, bucketID cdssdk.BucketID) (bool, error) {
  160. var pkg cdssdk.Package
  161. err := ctx.Table("Package").Where("BucketID = ?", bucketID).First(&pkg).Error
  162. if err == gorm.ErrRecordNotFound {
  163. return false, nil
  164. }
  165. if err != nil {
  166. return false, err
  167. }
  168. return true, nil
  169. }
  170. func (*PackageDB) Move(ctx SQLContext, packageID cdssdk.PackageID, newBktID cdssdk.BucketID, newName string) error {
  171. err := ctx.Table("Package").Where("PackageID = ?", packageID).Update("BucketID", newBktID).Update("Name", newName).Error
  172. return err
  173. }

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