pet-house/core/server/database/scope/paginate.go

56 lines
1.0 KiB
Go

package scope
import (
"gorm.io/gorm"
"pet-house.com/core/helper/str"
)
// PaginateScope return paginate scope for gorm
// - page int
// - pageSize int
// - sort string
// - orderBy string
func PaginateScope(page, pageSize int, sort, orderBy string) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
pageSize := getPageSize(pageSize)
offset := getOffset(page, pageSize)
return db.Order(getOrderBy(sort, orderBy)).Offset(offset).Limit(pageSize)
}
}
// getOffset
func getOffset(page, pageSize int) int {
if page == 0 {
page = 1
}
offset := (page - 1) * pageSize
if page < 0 {
offset = -1
}
return offset
}
// getPageSize
func getPageSize(pageSize int) int {
switch {
case pageSize > 100:
pageSize = 100
case pageSize < 0:
pageSize = -1
case pageSize == 0:
pageSize = 10
}
return pageSize
}
// getOrderBy
func getOrderBy(sort, orderBy string) string {
if sort == "" {
sort = "desc"
}
if orderBy == "" {
orderBy = "created_at"
}
return str.Join(orderBy, " ", sort)
}