@@ -10,38 +10,49 @@ import (
10
10
"xorm.io/xorm"
11
11
)
12
12
13
- // ListOptions options to paginate results
14
- type ListOptions struct {
15
- PageSize int
16
- Page int // start from 1
13
+ // Paginator is the base for different ListOptions types
14
+ type Paginator interface {
15
+ GetSkipTake () ( skip , take int )
16
+ GetStartEnd () ( start , end int )
17
17
}
18
18
19
- func (opts * ListOptions ) getPaginatedSession () * xorm.Session {
20
- opts .setDefaultValues ()
19
+ // getPaginatedSession creates a paginated database session
20
+ func getPaginatedSession (p Paginator ) * xorm.Session {
21
+ skip , take := p .GetSkipTake ()
21
22
22
- return x .Limit (opts . PageSize , ( opts . Page - 1 ) * opts . PageSize )
23
+ return x .Limit (take , skip )
23
24
}
24
25
25
- func (opts * ListOptions ) setSessionPagination (sess * xorm.Session ) * xorm.Session {
26
- opts .setDefaultValues ()
26
+ // setSessionPagination sets pagination for a database session
27
+ func setSessionPagination (sess * xorm.Session , p Paginator ) * xorm.Session {
28
+ skip , take := p .GetSkipTake ()
27
29
28
- if opts .PageSize <= 0 {
29
- return sess
30
- }
31
- return sess .Limit (opts .PageSize , (opts .Page - 1 )* opts .PageSize )
30
+ return sess .Limit (take , skip )
32
31
}
33
32
34
- func (opts * ListOptions ) setEnginePagination (e Engine ) Engine {
35
- opts .setDefaultValues ()
33
+ // setSessionPagination sets pagination for a database engine
34
+ func setEnginePagination (e Engine , p Paginator ) Engine {
35
+ skip , take := p .GetSkipTake ()
36
+
37
+ return e .Limit (take , skip )
38
+ }
39
+
40
+ // ListOptions options to paginate results
41
+ type ListOptions struct {
42
+ PageSize int
43
+ Page int // start from 1
44
+ }
36
45
37
- return e .Limit (opts .PageSize , (opts .Page - 1 )* opts .PageSize )
46
+ // GetSkipTake returns the skip and take values
47
+ func (opts * ListOptions ) GetSkipTake () (skip , take int ) {
48
+ opts .setDefaultValues ()
49
+ return (opts .Page - 1 ) * opts .PageSize , opts .PageSize
38
50
}
39
51
40
52
// GetStartEnd returns the start and end of the ListOptions
41
53
func (opts * ListOptions ) GetStartEnd () (start , end int ) {
42
- opts .setDefaultValues ()
43
- start = (opts .Page - 1 ) * opts .PageSize
44
- end = start + opts .PageSize
54
+ start , take := opts .GetSkipTake ()
55
+ end = start + take
45
56
return
46
57
}
47
58
@@ -56,3 +67,33 @@ func (opts *ListOptions) setDefaultValues() {
56
67
opts .Page = 1
57
68
}
58
69
}
70
+
71
+ // AbsoluteListOptions absolute options to paginate results
72
+ type AbsoluteListOptions struct {
73
+ skip int
74
+ take int
75
+ }
76
+
77
+ // NewAbsoluteListOptions creates a list option with applied limits
78
+ func NewAbsoluteListOptions (skip , take int ) * AbsoluteListOptions {
79
+ if skip < 0 {
80
+ skip = 0
81
+ }
82
+ if take <= 0 {
83
+ take = setting .API .DefaultPagingNum
84
+ }
85
+ if take > setting .API .MaxResponseItems {
86
+ take = setting .API .MaxResponseItems
87
+ }
88
+ return & AbsoluteListOptions {skip , take }
89
+ }
90
+
91
+ // GetSkipTake returns the skip and take values
92
+ func (opts * AbsoluteListOptions ) GetSkipTake () (skip , take int ) {
93
+ return opts .skip , opts .take
94
+ }
95
+
96
+ // GetStartEnd returns the start and end values
97
+ func (opts * AbsoluteListOptions ) GetStartEnd () (start , end int ) {
98
+ return opts .skip , opts .skip + opts .take
99
+ }
0 commit comments