38 lines
1.1 KiB
Go
38 lines
1.1 KiB
Go
// Package pagination contains GORM pagination helpers shared by repository
|
|
// implementations in the data layer.
|
|
package pagination
|
|
|
|
import "gorm.io/gorm"
|
|
|
|
// LimitOffset normalizes a page request and applies the optional maximum page
|
|
// size. A non-positive size means that no limit should be applied.
|
|
func LimitOffset(page, size, maxSize int) (limit, offset int) {
|
|
limit = size
|
|
if maxSize > 0 && size > maxSize {
|
|
limit = maxSize
|
|
}
|
|
if limit <= 0 {
|
|
return 0, 0
|
|
}
|
|
if page <= 0 {
|
|
page = 1
|
|
}
|
|
return limit, (page - 1) * limit
|
|
}
|
|
|
|
// Apply applies pagination only when the caller supplied a positive size.
|
|
func Apply(db *gorm.DB, page, size, maxSize int) *gorm.DB {
|
|
limit, offset := LimitOffset(page, size, maxSize)
|
|
if limit == 0 {
|
|
return db
|
|
}
|
|
return db.Offset(offset).Limit(limit)
|
|
}
|
|
|
|
// ApplyRequired always applies LIMIT/OFFSET, including LIMIT 0. This keeps
|
|
// the existing repository contract for APIs whose page size is mandatory.
|
|
func ApplyRequired(db *gorm.DB, page, size, maxSize int) *gorm.DB {
|
|
limit, offset := LimitOffset(page, size, maxSize)
|
|
return db.Offset(offset).Limit(limit)
|
|
}
|