pagination.tmpl 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. {{/*
  2. Copyright 2022-present Ryan SU (github.com/suyuan32). All rights reserved.
  3. This source code is licensed under the Apache 2.0 license found
  4. in the LICENSE file in the root directory of this source tree.
  5. */}}
  6. {{ define "pagination" }}
  7. {{- /*gotype: entgo.io/ent/entc/gen.Graph*/ -}}
  8. {{ template "header" $ }}
  9. {{ $pkg := base $.Config.Package }}
  10. {{ template "import" $ }}
  11. const errInvalidPage = "INVALID_PAGE"
  12. const (
  13. listField = "list"
  14. pageNumField = "pageNum"
  15. pageSizeField = "pageSize"
  16. )
  17. type PageDetails struct {
  18. Page uint64 `json:"page"`
  19. Size uint64 `json:"size"`
  20. Total uint64 `json:"total"`
  21. }
  22. // OrderDirection defines the directions in which to order a list of items.
  23. type OrderDirection string
  24. const (
  25. // OrderDirectionAsc specifies an ascending order.
  26. OrderDirectionAsc OrderDirection = "ASC"
  27. // OrderDirectionDesc specifies a descending order.
  28. OrderDirectionDesc OrderDirection = "DESC"
  29. )
  30. // Validate the order direction value.
  31. func (o OrderDirection) Validate() error {
  32. if o != OrderDirectionAsc && o != OrderDirectionDesc {
  33. return fmt.Errorf("%s is not a valid OrderDirection", o)
  34. }
  35. return nil
  36. }
  37. // String implements fmt.Stringer interface.
  38. func (o OrderDirection) String() string {
  39. return string(o)
  40. }
  41. func (o OrderDirection) reverse() OrderDirection {
  42. if o == OrderDirectionDesc {
  43. return OrderDirectionAsc
  44. }
  45. return OrderDirectionDesc
  46. }
  47. const errInvalidPagination = "INVALID_PAGINATION"
  48. {{ range $node := $.Nodes -}}
  49. {{- if ne $node.Name "CasbinRule" }}
  50. {{ $pager := print $node.Name "Pager" }}
  51. {{ $order := print $node.Name "Order"}}
  52. {{ $query := print $node.Name "Query"}}
  53. {{ $orderField := print $node.Name "OrderField"}}
  54. type {{ $pager }} struct {
  55. Order {{ lower $node.Name }}.OrderOption
  56. Filter func(*{{ $query }}) (*{{ $query }}, error)
  57. }
  58. {{ $opt := print $node.Name "PaginateOption" }}
  59. // {{ $opt }} enables pagination customization.
  60. type {{ $opt }} func(*{{ $pager }})
  61. {{ $newPager := print "new" $node.Name "Pager" -}}
  62. {{- $defaultOrder := print "Default" $node.Name "Order" }}
  63. {{ range $f := $node.Fields -}}
  64. {{- if eq $node.HasOneFieldID true}}
  65. // {{ $defaultOrder }} is the default ordering of {{ $node.Name }}.
  66. var {{ $defaultOrder }} = Desc({{ lower $node.Name }}.FieldID)
  67. {{- break}}
  68. {{- else}}
  69. // {{ $defaultOrder }} is the default ordering of {{ $node.Name }}.
  70. var {{ $defaultOrder }} = Desc({{ lower $node.Name }}.Field{{ $f.StructField }})
  71. {{- break}}
  72. {{- end}}
  73. {{end}}
  74. func {{ $newPager }}(opts []{{ $opt }}) (*{{ $pager }}, error) {
  75. pager := &{{ $pager }}{}
  76. for _, opt := range opts {
  77. opt(pager)
  78. }
  79. if pager.Order == nil {
  80. pager.Order = {{ $defaultOrder }}
  81. }
  82. return pager, nil
  83. }
  84. func (p *{{ $pager }}) ApplyFilter(query *{{ $query }}) (*{{ $query }}, error) {
  85. if p.Filter != nil {
  86. return p.Filter(query)
  87. }
  88. return query, nil
  89. }
  90. {{ $pageList := print $node.Name "PageList" -}}
  91. {{ $name := $node.Name }}
  92. // {{ $pageList }} is {{ $name }} PageList result.
  93. type {{ $pageList }} struct {
  94. List []*{{ $name }} `json:"list"`
  95. PageDetails *PageDetails `json:"pageDetails"`
  96. }
  97. {{ $r := $node.Receiver -}}
  98. {{ $queryName := print $node.QueryName -}}
  99. func ({{ $r }} *{{ $queryName }}) Page(
  100. ctx context.Context, pageNum uint64, pageSize uint64, opts ...{{ $opt }},
  101. ) (*{{ $pageList }}, error) {
  102. pager, err := {{ $newPager }}(opts)
  103. if err != nil {
  104. return nil, err
  105. }
  106. if {{ $r }}, err = pager.ApplyFilter({{ $r }}); err != nil {
  107. return nil, err
  108. }
  109. ret := &{{ $pageList }}{}
  110. ret.PageDetails = &PageDetails{
  111. Page: pageNum,
  112. Size: pageSize,
  113. }
  114. query := {{ $r }}.Clone()
  115. query.ctx.Fields = nil
  116. count, err := query.Count(ctx)
  117. if err != nil {
  118. return nil, err
  119. }
  120. ret.PageDetails.Total = uint64(count)
  121. if pager.Order != nil {
  122. {{ $r }} = {{ $r }}.Order(pager.Order)
  123. } else {
  124. {{ $r }} = {{ $r }}.Order({{ $defaultOrder }})
  125. }
  126. {{ $r }} = {{ $r }}.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
  127. list, err := {{ $r }}.All(ctx)
  128. if err != nil {
  129. return nil, err
  130. }
  131. ret.List = list
  132. return ret, nil
  133. }
  134. {{- end}}
  135. {{- end}}
  136. {{- end}}