paginator.go (1245B)
1 package handlers 2 3 import ( 4 "dkforest/pkg/utils" 5 "github.com/labstack/echo" 6 "gorm.io/gorm" 7 "math" 8 ) 9 10 type Paginator struct { 11 resultsPerPage int64 12 wantedPageQueryParam string 13 } 14 15 func NewPaginator() *Paginator { 16 return &Paginator{ 17 wantedPageQueryParam: "p", 18 resultsPerPage: 50, 19 } 20 } 21 22 func (p *Paginator) SetResultPerPage(v int64) *Paginator { 23 p.resultsPerPage = v 24 return p 25 } 26 27 func (p *Paginator) SetWantedPageQueryParam(v string) *Paginator { 28 p.wantedPageQueryParam = v 29 return p 30 } 31 32 func (p *Paginator) Paginate(c echo.Context, query *gorm.DB) (int64, int64, int64, *gorm.DB) { 33 wantedPage := utils.DoParseInt64(c.QueryParam(p.wantedPageQueryParam)) 34 var count int64 35 query.Session(&gorm.Session{}).Count(&count) 36 resultsPerPage := p.resultsPerPage 37 page, maxPage := paginate(resultsPerPage, wantedPage, count) 38 query = query.Offset(int((page - 1) * resultsPerPage)).Limit(int(resultsPerPage)) 39 return page, maxPage, count, query 40 } 41 42 func paginate(resultsPerPage, wantedPage, size int64) (page int64, maxPage int64) { 43 page = wantedPage 44 if page <= 1 { 45 page = 1 46 } 47 maxPage = int64(math.Ceil(float64(size) / float64(resultsPerPage))) 48 if maxPage <= 1 { 49 maxPage = 1 50 } 51 if page > maxPage { 52 page = maxPage 53 } 54 return 55 }