From 75c50a705f4cf2f40a8e5d7c4cb67542e9bcb117 Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 21 Oct 2019 23:04:17 +0200 Subject: [PATCH] Changed ReadAll method to enable proper pagination --- handler/config.go | 1 + handler/read_all.go | 28 +++++++++++++++++++++++++--- web.go | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/handler/config.go b/handler/config.go index c568e99..8a5aaaa 100644 --- a/handler/config.go +++ b/handler/config.go @@ -24,6 +24,7 @@ import ( type Config struct { AuthProvider *web.Auths LoggingProvider *logging.Logger + MaxItemsPerPage int64 } var config *Config diff --git a/handler/read_all.go b/handler/read_all.go index 1fd5db7..8e995e9 100644 --- a/handler/read_all.go +++ b/handler/read_all.go @@ -41,7 +41,7 @@ func (c *WebHandler) ReadAllWeb(ctx echo.Context) error { if page == "" { page = "1" } - pageNumber, err := strconv.Atoi(page) + pageNumber, err := strconv.ParseInt(page, 10, 64) if err != nil { config.LoggingProvider.Error(err.Error()) return echo.NewHTTPError(http.StatusBadRequest, "Bad page requested.") @@ -50,13 +50,35 @@ func (c *WebHandler) ReadAllWeb(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, "Bad page requested.") } + // Items per page + perPage := ctx.QueryParam("per_page") + perPageNumber, err := strconv.ParseInt(perPage, 10, 64) + if err != nil { + config.LoggingProvider.Error(err.Error()) + return echo.NewHTTPError(http.StatusBadRequest, "Bad per page amount requested.") + } + // Set default page count + if perPageNumber == 0 { + perPageNumber = config.MaxItemsPerPage + } + if perPageNumber < 1 { + return echo.NewHTTPError(http.StatusBadRequest, "Bad per page amount requested.") + } + if perPageNumber > config.MaxItemsPerPage { + perPageNumber = config.MaxItemsPerPage + } + // Search search := ctx.QueryParam("s") - lists, err := currentStruct.ReadAll(search, currentAuth, pageNumber) + result, resultCount, numberOfPages, err := currentStruct.ReadAll(currentAuth, search, pageNumber, perPageNumber) if err != nil { return HandleHTTPError(err, ctx) } - return ctx.JSON(http.StatusOK, lists) + ctx.Response().Header().Set("x-pagination-total-pages", strconv.FormatInt(numberOfPages, 10)) + ctx.Response().Header().Set("x-pagination-result-count", strconv.FormatInt(resultCount, 10)) + ctx.Response().Header().Set("Access-Control-Expose-Headers", "x-pagination-total-pages, x-pagination-result-count") + + return ctx.JSON(http.StatusOK, result) } diff --git a/web.go b/web.go index 868c367..ba126fd 100644 --- a/web.go +++ b/web.go @@ -31,7 +31,7 @@ type Rights interface { type CRUDable interface { Create(Auth) error ReadOne() error - ReadAll(string, Auth, int) (interface{}, error) + ReadAll(auth Auth, search string, page int64, perPage int64) (result interface{}, resultCount int64, numberOfPages int64, err error) Update() error Delete() error }