-
Notifications
You must be signed in to change notification settings - Fork 28
/
pagination.go
118 lines (94 loc) · 2.4 KB
/
pagination.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package pagination
import "math"
// Pagination stores pagination request data
type Pagination struct {
t PaginationType
offsetParams PaginationOffsetParams
// TODO: Cursor pagination
// cursorParams *PaginationCursorParams
}
func NewOffsetPagination(page int64, limit int64) *Pagination {
return &Pagination{
t: PAGINATION_OFFSET,
offsetParams: PaginationOffsetParams{
Page: page,
Limit: limit,
},
}
}
func (pagination *Pagination) Type() PaginationType {
return pagination.t
}
func (pagination *Pagination) OffsetParams() *PaginationOffsetParams {
if pagination.Type() != PAGINATION_OFFSET {
return nil
}
return &pagination.offsetParams
}
// TODO: Cursor pagination
// func (pagination *Pagination) CursorParams() *PaginationCursorParams {
// return &pagination.cursorParams
// }
func (pagination *Pagination) OffsetResult(totalRecord int64) *PaginationResult {
if pagination.Type() != PAGINATION_OFFSET {
return nil
}
return NewOffsetPaginationResult(
totalRecord,
pagination.offsetParams.Page,
pagination.offsetParams.Limit,
)
}
type PaginationOffsetParams struct {
Page int64
Limit int64
}
func (params *PaginationOffsetParams) Offset() int64 {
return params.Limit * (params.Page - 1)
}
// TODO: Cursor pagination
// type PaginationCursorParams struct {
// Direction PaginationCursorDirection
// CursorId interface{}
// }
// type PaginationCursorDirection = int8
// const (
// PAGINATION_CURSOR_NEXT = 0
// PAGINATION_CURSOR_BACK = 1
// )
type PaginationResult struct {
t PaginationType
offsetResult PaginationOffsetResult
}
func NewOffsetPaginationResult(totalRecord int64, currentPage int64, limit int64) *PaginationResult {
return &PaginationResult{
t: PAGINATION_OFFSET,
offsetResult: PaginationOffsetResult{
TotalRecord: totalRecord,
CurrentPage: currentPage,
Limit: limit,
},
}
}
func (result *PaginationResult) Type() PaginationType {
return result.t
}
func (result *PaginationResult) OffsetResult() *PaginationOffsetResult {
if result.Type() != PAGINATION_OFFSET {
return nil
}
return &result.offsetResult
}
type PaginationOffsetResult struct {
TotalRecord int64
CurrentPage int64
Limit int64
}
func (result *PaginationOffsetResult) TotalPage() int64 {
return int64(math.Ceil(float64(result.TotalRecord) / float64(result.Limit)))
}
type PaginationType = string
const (
PAGINATION_OFFSET PaginationType = "offset"
// PAGINATION_CURSOR
)