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-02-09 09:28:39 -08:00
|
|
|
// get page number
|
2022-11-23 04:06:29 -08:00
|
|
|
pageNumberStr := ctx.Query("page", "0")
|
|
|
|
pageNumber, err := strconv.ParseInt(pageNumberStr, 10, 64)
|
2023-02-09 09:28:39 -08:00
|
|
|
if err != nil || pageNumber < 0 {
|
|
|
|
msg := `parameter 'page' must be a non-negative integer`
|
|
|
|
return nil, response.NewInvalidParamError(ctx, msg, err)
|
2022-11-23 04:06:29 -08:00
|
|
|
}
|
|
|
|
|
2023-02-09 09:28:39 -08:00
|
|
|
// get page size
|
2022-11-23 04:06:29 -08:00
|
|
|
pageSizeStr := ctx.Query("pageSize", "50")
|
|
|
|
pageSize, err := strconv.ParseInt(pageSizeStr, 10, 64)
|
2023-02-09 09:28:39 -08:00
|
|
|
if err != nil || pageSize <= 0 {
|
|
|
|
msg := `parameter 'pageSize' must be a positive integer`
|
|
|
|
return nil, response.NewInvalidParamError(ctx, msg, err)
|
2022-11-23 04:06:29 -08:00
|
|
|
}
|
2023-02-09 09:28:39 -08:00
|
|
|
skip := pageSize * pageNumber
|
2022-11-23 04:06:29 -08:00
|
|
|
|
2023-02-09 09:28:39 -08:00
|
|
|
// get sort order
|
|
|
|
sortOrder := strings.ToUpper(ctx.Query("sortOrder", "DESC"))
|
|
|
|
if sortOrder != "ASC" && sortOrder != "DESC" {
|
|
|
|
msg := `parameter 'sortOrder' must either be 'ASC' or 'DESC'`
|
|
|
|
return nil, response.NewInvalidParamError(ctx, msg, nil)
|
|
|
|
}
|
2022-11-23 04:06:29 -08:00
|
|
|
|
2023-02-09 09:28:39 -08:00
|
|
|
// `sortBy` is currently not exposed as a parameter, but could be in the future.
|
|
|
|
sortBy := ctx.Query("sortBy", "indexedAt")
|
2022-11-23 04:06:29 -08:00
|
|
|
|
2023-02-09 09:28:39 -08:00
|
|
|
// initialize the result struct and return
|
|
|
|
p := &pagination.Pagination{
|
|
|
|
Skip: skip,
|
|
|
|
Limit: pageSize,
|
|
|
|
SortOrder: sortOrder,
|
|
|
|
SortBy: sortBy,
|
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
|
|
|
}
|