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

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