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.

pageresourcerangelogic.go 2.3 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package core
  2. import (
  3. "context"
  4. "fmt"
  5. "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models"
  6. "gorm.io/gorm"
  7. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
  8. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
  9. "github.com/zeromicro/go-zero/core/logx"
  10. )
  11. type PageResourceRangeLogic struct {
  12. logx.Logger
  13. ctx context.Context
  14. svcCtx *svc.ServiceContext
  15. }
  16. func NewPageResourceRangeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PageResourceRangeLogic {
  17. return &PageResourceRangeLogic{
  18. Logger: logx.WithContext(ctx),
  19. ctx: ctx,
  20. svcCtx: svcCtx,
  21. }
  22. }
  23. func (l *PageResourceRangeLogic) PageResourceRange(req *types.ResourceSpecReq) (resp *types.PageResult, err error) {
  24. if req.PageNum <= 0 || req.PageSize <= 0 {
  25. return nil, fmt.Errorf("invalid pagination parameters: PageNum=%d, PageSize=%d", req.PageNum, req.PageSize)
  26. }
  27. result := &types.PageResult{
  28. PageNum: req.PageNum,
  29. PageSize: req.PageSize,
  30. }
  31. query := l.buildBaseQuery(req)
  32. if err := query.Count(&result.Total).Error; err != nil {
  33. return nil, fmt.Errorf("failed to count records: %w", err)
  34. }
  35. var specs []*models.TResourceSpec
  36. if err := query.Model(models.TResourceSpec{}).Preload("BaseResourceSpecs").
  37. Scopes(paginate(req.PageNum, req.PageSize)).
  38. Find(&specs).Error; err != nil {
  39. return nil, fmt.Errorf("failed to query resources: %w", err)
  40. }
  41. result.List = specs
  42. return result, nil
  43. }
  44. func (l *PageResourceRangeLogic) buildBaseQuery(req *types.ResourceSpecReq) *gorm.DB {
  45. query := l.svcCtx.DbEngin.Model(&models.TResourceSpec{}).
  46. Where("deleted_at IS NULL")
  47. if req.ClusterId != "" {
  48. query = query.Where("cluster_id = ?", req.ClusterId)
  49. }
  50. if req.Tag != "" {
  51. query = query.Where("tag = ?", req.Tag)
  52. }
  53. if req.Status != "" {
  54. query = query.Where("status = ?", req.Status)
  55. }
  56. if req.ChangeType != "" {
  57. query = query.Where("change_type = ?", req.ChangeType)
  58. }
  59. if req.Type != "" {
  60. query = query.Where("type = ?", req.Type)
  61. }
  62. if req.Name != "" {
  63. query = query.Where("name LIKE ?", "%"+req.Name+"%")
  64. }
  65. return query
  66. }
  67. func paginate(pageNum, pageSize int) func(db *gorm.DB) *gorm.DB {
  68. return func(db *gorm.DB) *gorm.DB {
  69. offset := (pageNum - 1) * pageSize
  70. return db.Offset(offset).Limit(pageSize).Order("create_time DESC")
  71. }
  72. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.