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 4.4 kB

7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package services
  2. import (
  3. "fmt"
  4. "time"
  5. "gitlink.org.cn/cloudream/common/pkgs/logger"
  6. "gitlink.org.cn/cloudream/jcs-pub/client/internal/db"
  7. jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
  8. "gitlink.org.cn/cloudream/jcs-pub/common/types/datamap"
  9. )
  10. // PackageService 提供对包相关操作的服务接口
  11. type PackageService struct {
  12. *Service
  13. }
  14. // PackageSvc 创建并返回一个PackageService的实例
  15. func (svc *Service) PackageSvc() *PackageService {
  16. return &PackageService{Service: svc}
  17. }
  18. func (svc *PackageService) GetBucketPackages(bucketID jcstypes.BucketID) ([]jcstypes.Package, error) {
  19. return svc.DB.Package().GetBucketPackages(svc.DB.DefCtx(), bucketID)
  20. }
  21. func (svc *PackageService) Create(bucketID jcstypes.BucketID, name string) (jcstypes.Package, error) {
  22. pkg, err := svc.DB.Package().Create(svc.DB.DefCtx(), bucketID, name, time.Now())
  23. if err != nil {
  24. return jcstypes.Package{}, err
  25. }
  26. svc.EvtPub.Publish(&datamap.BodyNewPackage{
  27. Info: pkg,
  28. })
  29. return pkg, nil
  30. }
  31. // DeletePackage 删除指定的包
  32. func (svc *PackageService) DeletePackage(packageID jcstypes.PackageID) error {
  33. err := svc.DB.Package().DeleteComplete(svc.DB.DefCtx(), packageID)
  34. if err != nil {
  35. return err
  36. }
  37. svc.EvtPub.Publish(&datamap.BodyPackageDeleted{
  38. PackageID: packageID,
  39. })
  40. return nil
  41. }
  42. func (svc *PackageService) Clone(packageID jcstypes.PackageID, bucketID jcstypes.BucketID, name string) (jcstypes.Package, error) {
  43. var pkg jcstypes.Package
  44. var oldObjIDs []jcstypes.ObjectID
  45. var newObjIDs []jcstypes.ObjectID
  46. err := svc.DB.DoTx(func(tx db.SQLContext) error {
  47. var err error
  48. pkg, err = svc.DB.Package().Create(tx, bucketID, name, time.Now())
  49. if err != nil {
  50. return fmt.Errorf("creating package: %w", err)
  51. }
  52. objs, err := svc.DB.Object().GetPackageObjects(tx, packageID)
  53. if err != nil {
  54. return fmt.Errorf("getting package objects: %w", err)
  55. }
  56. objBlks, err := svc.DB.ObjectBlock().GetInPackageID(tx, packageID)
  57. if err != nil {
  58. return fmt.Errorf("getting object blocks: %w", err)
  59. }
  60. clonedObjs := make([]jcstypes.Object, len(objs))
  61. for i, obj := range objs {
  62. clonedObjs[i] = obj
  63. clonedObjs[i].ObjectID = 0
  64. clonedObjs[i].PackageID = pkg.PackageID
  65. }
  66. err = svc.DB.Object().BatchCreate(tx, &clonedObjs)
  67. if err != nil {
  68. return fmt.Errorf("batch creating objects: %w", err)
  69. }
  70. oldToNew := make(map[jcstypes.ObjectID]jcstypes.ObjectID)
  71. for i, obj := range clonedObjs {
  72. oldToNew[objs[i].ObjectID] = obj.ObjectID
  73. oldObjIDs = append(oldObjIDs, objs[i].ObjectID)
  74. newObjIDs = append(newObjIDs, obj.ObjectID)
  75. }
  76. clonedBlks := make([]jcstypes.ObjectBlock, len(objBlks))
  77. for i, blk := range objBlks {
  78. clonedBlks[i] = blk
  79. clonedBlks[i].ObjectID = oldToNew[blk.ObjectID]
  80. }
  81. err = svc.DB.ObjectBlock().BatchCreate(tx, clonedBlks)
  82. if err != nil {
  83. return fmt.Errorf("batch creating object blocks: %w", err)
  84. }
  85. return nil
  86. })
  87. if err != nil {
  88. return jcstypes.Package{}, err
  89. }
  90. svc.EvtPub.Publish(&datamap.BodyPackageCloned{
  91. SourcePackageID: packageID,
  92. NewPackage: pkg,
  93. SourceObjectIDs: oldObjIDs,
  94. NewObjectIDs: newObjIDs,
  95. })
  96. return pkg, nil
  97. }
  98. func (svc *PackageService) AddAccessStat(entries []db.AddAccessStatEntry) {
  99. pkgIDs := make([]jcstypes.PackageID, len(entries))
  100. objIDs := make([]jcstypes.ObjectID, len(entries))
  101. for i, e := range entries {
  102. pkgIDs[i] = e.PackageID
  103. objIDs[i] = e.ObjectID
  104. }
  105. err := svc.DB.DoTx(func(tx db.SQLContext) error {
  106. avaiPkgIDs, err := svc.DB.Package().BatchTestPackageID(tx, pkgIDs)
  107. if err != nil {
  108. return fmt.Errorf("batch test package id: %w", err)
  109. }
  110. avaiObjIDs, err := svc.DB.Object().BatchTestObjectID(tx, objIDs)
  111. if err != nil {
  112. return fmt.Errorf("batch test object id: %w", err)
  113. }
  114. var willAdds []db.AddAccessStatEntry
  115. for _, e := range entries {
  116. if avaiPkgIDs[e.PackageID] && avaiObjIDs[e.ObjectID] {
  117. willAdds = append(willAdds, e)
  118. }
  119. }
  120. if len(willAdds) > 0 {
  121. err := svc.DB.PackageAccessStat().BatchAddCounter(tx, willAdds)
  122. if err != nil {
  123. return fmt.Errorf("batch add package access stat counter: %w", err)
  124. }
  125. err = svc.DB.ObjectAccessStat().BatchAddCounter(tx, willAdds)
  126. if err != nil {
  127. return fmt.Errorf("batch add object access stat counter: %w", err)
  128. }
  129. }
  130. return nil
  131. })
  132. if err != nil {
  133. logger.Warn(err.Error())
  134. }
  135. }

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