wormhole-explorer/api/middleware/extract_pagination.go

61 lines
1.6 KiB
Go

// package middleare contains all the middleware function to use in the API.
package middleware
import (
"strconv"
"strings"
"github.com/gofiber/fiber/v2"
"github.com/wormhole-foundation/wormhole-explorer/api/internal/pagination"
"github.com/wormhole-foundation/wormhole-explorer/api/response"
)
// ExtractPagination parses pagination-related query parameters.
func ExtractPagination(ctx *fiber.Ctx) (*pagination.Pagination, error) {
// get page number from query params
var pageNumber *int64
if param := ctx.Query("page"); param != "" {
n, err := strconv.ParseInt(param, 10, 64)
if err != nil || n < 0 {
msg := `parameter 'page' must be a non-negative integer`
return nil, response.NewInvalidParamError(ctx, msg, err)
}
pageNumber = &n
}
// get page size from query params
var pageSize *int64
if param := ctx.Query("pageSize"); param != "" {
n, err := strconv.ParseInt(param, 10, 64)
if err != nil || n <= 0 {
msg := `parameter 'pageSize' must be a positive integer`
return nil, response.NewInvalidParamError(ctx, msg, err)
}
pageSize = &n
}
// get sort order from query params
var sortOrder string
if param := strings.ToUpper(ctx.Query("sortOrder", "DESC")); param != "" {
if param != "ASC" && param != "DESC" {
msg := `parameter 'sortOrder' must either be 'ASC' or 'DESC'`
return nil, response.NewInvalidParamError(ctx, msg, nil)
}
sortOrder = param
}
// build the result and return
p := pagination.Default()
if sortOrder != "" {
p.SetSortOrder(sortOrder)
}
if pageSize != nil {
p.SetLimit(*pageSize)
}
if pageNumber != nil {
p.SetSkip(p.Limit * *pageNumber)
}
return p, nil
}