8 "github.com/gin-gonic/gin"
10 "github.com/vapor/errors"
15 defaultLimitStr = "10"
20 errParsePaginationStart = fmt.Errorf("parse pagination start")
21 errParsePaginationLimit = fmt.Errorf("parse pagination limit")
24 type PaginationQuery struct {
25 Start uint64 `json:"start"`
26 Limit uint64 `json:"limit"`
29 // parsePagination request meets the standard on https://developer.atlassian.com/server/confluence/pagination-in-the-rest-api/
30 func parsePagination(c *gin.Context) (*PaginationQuery, error) {
31 startStr := c.DefaultQuery("start", defaultSatrtStr)
32 limitStr := c.DefaultQuery("limit", defaultLimitStr)
34 start, err := strconv.ParseUint(startStr, 10, 64)
36 return nil, errors.Wrap(err, errParsePaginationStart)
39 limit, err := strconv.ParseUint(limitStr, 10, 64)
41 return nil, errors.Wrap(err, errParsePaginationLimit)
44 if limit > maxPageLimit {
48 return &PaginationQuery{
54 type PaginationInfo struct {
60 func processPaginationIfPresent(fun handlerFun, args []interface{}, result []interface{}, context *gin.Context) bool {
61 ft := reflect.TypeOf(fun)
67 size := reflect.ValueOf(list).Len()
68 query := args[2].(*PaginationQuery)
70 paginationInfo := &PaginationInfo{Start: query.Start, Limit: query.Limit, HasNext: size == int(query.Limit)}
71 respondSuccessPaginationResp(context, list, paginationInfo)