Go Gin & Gorm Pagination

Finally get gin gorm pagination,

import (
	"net/http"

	"banners/internal/model"
	"banners/internal/helper"
	"github.com/gin-gonic/gin"
)

func (a *App) IndexBanner(c *gin.Context) {
	
	pagination := helper.Pagination(c)
	var banner model.Banner
	banners, _ := a.PaginationBanners(&banner, &pagination)

	c.JSON(http.StatusOK, gin.H{
		"message": "success",
		"code":    http.StatusOK,
		"data":    banners,
		"status":  true,
	})
}
// app/pagination.go

package app

import (
	"log"

	"banners/internal/model"
)

func (a *App) PaginationBanners(banner *model.Banner, pagination *model.Pagination) (*[]model.Banner, error) {
	var banners []model.Banner

	offset := (pagination.Page - 1) * pagination.Limit

	queryBuilder := a.db.Limit(pagination.Limit).Offset(offset).Order(pagination.Sort)

	result := queryBuilder.Model(&model.Banner{}).Where(banner).Find(&banners)

	if result.Error != nil {
		message := result.Error
		return nil, message
	}

	return &banners, nil
}
// model/pagination.go

package model

type Pagination struct {
	Limit int    `json:"limit`
	Page  int    `json:"page"`
	Sort  string `json:"sort"`
}
// helper/pagination.go


import (
	"strconv"
	"banners/internal/model"
	"github.com/gin-gonic/gin"
)

func Pagination(c *gin.Context) model.Pagination {
	limit := 1
	page := 1
	sort := `created_at DESC`
	query := c.Request.URL.Query()

	for key, value := range query {
		queryValue := value[len(value)-1]
		switch key {
		case "limit":
			limit, _ = strconv.Atoi(queryValue)
			break
		case "page":
			page, _ = strconv.Atoi(queryValue)
			break
		case "sort":
			sort = queryValue
			break
		}
	}

	return model.Pagination{
		Limit: limit,
		Page:  page,
		Sort:  sort,
	}
}