36 lines
788 B
Go
36 lines
788 B
Go
|
|
package pagination
|
||
|
|
|
||
|
|
import "math"
|
||
|
|
|
||
|
|
type Params struct {
|
||
|
|
Page int
|
||
|
|
PerPage int
|
||
|
|
TotalCount int
|
||
|
|
TotalPages int
|
||
|
|
OverallCount int
|
||
|
|
}
|
||
|
|
|
||
|
|
func PrepareParams(params *Params) *Params {
|
||
|
|
totalPages := int(math.Ceil(float64(params.TotalCount) / float64(params.PerPage)))
|
||
|
|
params.TotalPages = totalPages
|
||
|
|
|
||
|
|
if params.Page > totalPages {
|
||
|
|
params.Page = totalPages
|
||
|
|
}
|
||
|
|
return params
|
||
|
|
}
|
||
|
|
|
||
|
|
func PaginatedResponse(data any, params *Params) *Response {
|
||
|
|
pagination := Pagination{
|
||
|
|
Page: params.Page,
|
||
|
|
PerPage: params.PerPage,
|
||
|
|
Total: params.TotalCount,
|
||
|
|
TotalPages: params.TotalPages,
|
||
|
|
HasNext: params.Page < params.TotalPages,
|
||
|
|
HasPrev: params.Page > 1,
|
||
|
|
OverallCount: params.OverallCount,
|
||
|
|
}
|
||
|
|
|
||
|
|
return &Response{Pagination: pagination, Data: data}
|
||
|
|
}
|