forked from NYANDEV/forgejo
42 lines
1 KiB
Go
42 lines
1 KiB
Go
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||
|
// SPDX-License-Identifier: MIT
|
||
|
|
||
|
package internal
|
||
|
|
||
|
import (
|
||
|
"math"
|
||
|
|
||
|
"code.gitea.io/gitea/models/db"
|
||
|
)
|
||
|
|
||
|
// ParsePaginator parses a db.Paginator into a skip and limit
|
||
|
func ParsePaginator(paginator db.Paginator, max ...int) (int, int) {
|
||
|
// Use a very large number to indicate no limit
|
||
|
unlimited := math.MaxInt32
|
||
|
if len(max) > 0 {
|
||
|
// Some indexer engines have a limit on the page size, respect that
|
||
|
unlimited = max[0]
|
||
|
}
|
||
|
|
||
|
if paginator == nil || paginator.IsListAll() {
|
||
|
return 0, unlimited
|
||
|
}
|
||
|
|
||
|
// Warning: Do not use GetSkipTake() for *db.ListOptions
|
||
|
// Its implementation could reset the page size with setting.API.MaxResponseItems
|
||
|
if listOptions, ok := paginator.(*db.ListOptions); ok {
|
||
|
if listOptions.Page >= 0 && listOptions.PageSize > 0 {
|
||
|
var start int
|
||
|
if listOptions.Page == 0 {
|
||
|
start = 0
|
||
|
} else {
|
||
|
start = (listOptions.Page - 1) * listOptions.PageSize
|
||
|
}
|
||
|
return start, listOptions.PageSize
|
||
|
}
|
||
|
return 0, unlimited
|
||
|
}
|
||
|
|
||
|
return paginator.GetSkipTake()
|
||
|
}
|