dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

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 }