From 1ffc999e1ae39f0b853a4f6ac75ffb19d9cdec02 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Thu, 19 Jan 2023 00:19:52 +0100 Subject: [PATCH] Solved several pagination problems --- internal/articles/get.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/internal/articles/get.go b/internal/articles/get.go index 1f6f531..ad7d74e 100644 --- a/internal/articles/get.go +++ b/internal/articles/get.go @@ -16,11 +16,20 @@ func getApiFullUrl() string { } func getArticleSkipTakeFullUrl(skip uint64, take uint64) string { - return fmt.Sprintf("%v/articles?skip=%v&take=%v", getApiFullUrl(), skip+take, take) + return fmt.Sprintf("%varticles?skip=%v&take=%v", getApiFullUrl(), skip+take, take) } func getBuiltGetResponse(articles []Article, skip uint64, take uint64) map[string]any { - slicedArticles := articles[skip : skip+take] + articlesCap := uint64(len(articles)) + + var normTake uint64 + if skip+take > articlesCap { + normTake = articlesCap + } else { + normTake = skip + take + } + + slicedArticles := articles[skip:normTake] return map[string]any{ "content": slicedArticles, "total": len(slicedArticles), @@ -35,11 +44,11 @@ func getBuiltGetResponse(articles []Article, skip uint64, take uint64) map[strin } } -func parseUintQueryParam(c *gin.Context, param string) (uint64, error) { - value, err := strconv.ParseUint(c.Query(param), 10, 0) - if err != nil { - c.JSON(http.StatusBadRequest, fmt.Sprintf("%s query parameter must be a positive number.", param)) +func parseUintQueryParam(c *gin.Context, param string, defaultValue uint64) (uint64, error) { + if c.Query(param) == "" { + return defaultValue, nil } + value, err := strconv.ParseUint(c.Query(param), 10, 0) return value, err } @@ -54,9 +63,10 @@ func getArticleIdFilter(titleID string) map[string]any { func Get(c *gin.Context) { titleID := c.Params.ByName("id") - skip, skipErr := parseUintQueryParam(c, "skip") - take, takeErr := parseUintQueryParam(c, "take") + skip, skipErr := parseUintQueryParam(c, "skip", 0) + take, takeErr := parseUintQueryParam(c, "take", 10) if skipErr != nil || takeErr != nil { + api.SendBadRequest(c, "Take and Skip query parameters must be positive numbers.") return }