You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.4 KiB
Cheetah
147 lines
4.4 KiB
Cheetah
1 year ago
|
{{ define "import/additional/page" }}
|
||
|
"git.noahlan.cn/noahlan/ntool-biz/core/page"
|
||
|
{{- end }}
|
||
|
|
||
|
{{ define "pagination" }}
|
||
|
{{- /*gotype: entgo.io/ent/entc/gen.Graph*/ -}}
|
||
|
|
||
|
{{ template "header" $ }}
|
||
|
{{ $pkg := base $.Config.Package }}
|
||
|
{{ template "import" $ }}
|
||
|
|
||
|
type PageDetails = page.Pagination
|
||
|
|
||
|
// OrderDirection defines the directions in which to order a list of items.
|
||
|
type OrderDirection string
|
||
|
|
||
|
const (
|
||
|
// OrderDirectionAsc specifies an ascending order.
|
||
|
OrderDirectionAsc OrderDirection = "ASC"
|
||
|
// OrderDirectionDesc specifies a descending order.
|
||
|
OrderDirectionDesc OrderDirection = "DESC"
|
||
|
)
|
||
|
|
||
|
// Validate the order direction value.
|
||
|
func (o OrderDirection) Validate() error {
|
||
|
if o != OrderDirectionAsc && o != OrderDirectionDesc {
|
||
|
return fmt.Errorf("%s is not a valid OrderDirection", o)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// String implements fmt.Stringer interface.
|
||
|
func (o OrderDirection) String() string {
|
||
|
return string(o)
|
||
|
}
|
||
|
|
||
|
func (o OrderDirection) reverse() OrderDirection {
|
||
|
if o == OrderDirectionDesc {
|
||
|
return OrderDirectionAsc
|
||
|
}
|
||
|
return OrderDirectionDesc
|
||
|
}
|
||
|
|
||
|
const errInvalidPagination = "INVALID_PAGINATION"
|
||
|
|
||
|
{{ range $node := $.Nodes -}}
|
||
|
{{- if ne $node.Name "CasbinRule" }}
|
||
|
{{ $pager := print $node.Name "Pager" }}
|
||
|
{{ $order := print $node.Name "Order"}}
|
||
|
{{ $query := print $node.Name "Query"}}
|
||
|
{{ $orderField := print $node.Name "OrderField"}}
|
||
|
type {{ $pager }} struct {
|
||
|
Order {{ lower $node.Name }}.OrderOption
|
||
|
Filter func(*{{ $query }}) (*{{ $query }}, error)
|
||
|
}
|
||
|
|
||
|
{{ $opt := print $node.Name "PaginateOption" }}
|
||
|
// {{ $opt }} enables pagination customization.
|
||
|
type {{ $opt }} func(*{{ $pager }})
|
||
|
|
||
|
|
||
|
{{ $newPager := print "new" $node.Name "Pager" -}}
|
||
|
{{- $defaultOrder := print "Default" $node.Name "Order" }}
|
||
|
|
||
|
// {{ $defaultOrder }} is the default ordering of {{ $node.Name }}.
|
||
|
var {{ $defaultOrder }} = Desc({{ lower $node.Name }}.FieldID)
|
||
|
|
||
|
func {{ $newPager }}(opts []{{ $opt }}) (*{{ $pager }}, error) {
|
||
|
pager := &{{ $pager }}{}
|
||
|
for _, opt := range opts {
|
||
|
opt(pager)
|
||
|
}
|
||
|
if pager.Order == nil {
|
||
|
pager.Order = {{ $defaultOrder }}
|
||
|
}
|
||
|
return pager, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func (p *{{ $pager }}) ApplyFilter(query *{{ $query }}) (*{{ $query }}, error) {
|
||
|
if p.Filter != nil {
|
||
|
return p.Filter(query)
|
||
|
}
|
||
|
return query, nil
|
||
|
}
|
||
|
|
||
|
{{ $pageList := print $node.Name "PageList" -}}
|
||
|
{{ $name := $node.Name }}
|
||
|
|
||
|
// {{ $pageList }} is {{ $name }} PageList result.
|
||
|
type {{ $pageList }} struct {
|
||
|
List []*{{ $name }} `json:"list"`
|
||
|
PageDetails *PageDetails `json:"pageDetails"`
|
||
|
}
|
||
|
|
||
|
|
||
|
{{ $r := $node.Receiver -}}
|
||
|
{{ $queryName := print $node.QueryName -}}
|
||
|
|
||
|
func ({{ $r }} *{{ $queryName }}) Page(
|
||
|
ctx context.Context, pageNum uint64, pageSize uint64, opts ...{{ $opt }},
|
||
|
) (*{{ $pageList }}, error) {
|
||
|
|
||
|
pager, err := {{ $newPager }}(opts)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if {{ $r }}, err = pager.ApplyFilter({{ $r }}); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
ret := &{{ $pageList }}{}
|
||
|
|
||
|
ret.PageDetails = &PageDetails{
|
||
|
Current: int64(pageNum),
|
||
|
Size: int64(pageSize),
|
||
|
}
|
||
|
|
||
|
acClone := {{ $r }}.Clone()
|
||
|
acClone.modifiers = {{ $r }}.modifiers
|
||
|
count, err := acClone.Count(ctx)
|
||
|
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
ret.PageDetails.Total = int64(count)
|
||
|
|
||
|
if pager.Order != nil {
|
||
|
{{ $r }} = {{ $r }}.Order(pager.Order)
|
||
|
} else {
|
||
|
{{ $r }} = {{ $r }}.Order({{ $defaultOrder }})
|
||
|
}
|
||
|
|
||
|
{{ $r }} = {{ $r }}.Offset(int((pageNum - 1) * pageSize)).Limit(int(pageSize))
|
||
|
list, err := {{ $r }}.All(ctx)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
ret.List = list
|
||
|
|
||
|
return ret, nil
|
||
|
}
|
||
|
{{- end}}
|
||
|
{{- end}}
|
||
|
{{- end}}
|