2022-11-23 04:06:29 -08:00
|
|
|
// package middleare contains all the middleware function to use in the API.
|
2022-11-17 07:37:29 -08:00
|
|
|
package middleware
|
|
|
|
|
|
|
|
import (
|
2022-11-23 04:06:29 -08:00
|
|
|
"strconv"
|
2023-02-09 09:28:39 -08:00
|
|
|
"strings"
|
2022-11-23 04:06:29 -08:00
|
|
|
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
"github.com/wormhole-foundation/wormhole-explorer/api/internal/pagination"
|
2023-02-09 09:28:39 -08:00
|
|
|
"github.com/wormhole-foundation/wormhole-explorer/api/response"
|
2022-11-17 07:37:29 -08:00
|
|
|
)
|
|
|
|
|
2023-02-09 09:28:39 -08:00
|
|
|
// ExtractPagination parses pagination-related query parameters.
|
|
|
|
func ExtractPagination(ctx *fiber.Ctx) (*pagination.Pagination, error) {
|
2022-11-23 04:06:29 -08:00
|
|
|
|
2023-04-28 06:18:07 -07:00
|
|
|
// 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
|
2022-11-23 04:06:29 -08:00
|
|
|
}
|
|
|
|
|
2023-04-28 06:18:07 -07:00
|
|
|
// 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
|
2022-11-23 04:06:29 -08:00
|
|
|
}
|
|
|
|
|
2023-04-28 06:18:07 -07:00
|
|
|
// 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
|
2023-02-09 09:28:39 -08:00
|
|
|
}
|
2022-11-23 04:06:29 -08:00
|
|
|
|
2023-04-28 06:18:07 -07:00
|
|
|
// 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)
|
2022-11-23 04:06:29 -08:00
|
|
|
}
|
2023-02-09 09:28:39 -08:00
|
|
|
return p, nil
|
2022-11-23 04:06:29 -08:00
|
|
|
}
|