Solved several pagination problems

This commit is contained in:
Florian Sylvain
2023-01-19 00:19:52 +01:00
parent 3376d88f56
commit 1ffc999e1a
+18 -8
View File
@@ -16,11 +16,20 @@ func getApiFullUrl() string {
} }
func getArticleSkipTakeFullUrl(skip uint64, take uint64) 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 { 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{ return map[string]any{
"content": slicedArticles, "content": slicedArticles,
"total": len(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) { func parseUintQueryParam(c *gin.Context, param string, defaultValue uint64) (uint64, error) {
value, err := strconv.ParseUint(c.Query(param), 10, 0) if c.Query(param) == "" {
if err != nil { return defaultValue, nil
c.JSON(http.StatusBadRequest, fmt.Sprintf("%s query parameter must be a positive number.", param))
} }
value, err := strconv.ParseUint(c.Query(param), 10, 0)
return value, err return value, err
} }
@@ -54,9 +63,10 @@ func getArticleIdFilter(titleID string) map[string]any {
func Get(c *gin.Context) { func Get(c *gin.Context) {
titleID := c.Params.ByName("id") titleID := c.Params.ByName("id")
skip, skipErr := parseUintQueryParam(c, "skip") skip, skipErr := parseUintQueryParam(c, "skip", 0)
take, takeErr := parseUintQueryParam(c, "take") take, takeErr := parseUintQueryParam(c, "take", 10)
if skipErr != nil || takeErr != nil { if skipErr != nil || takeErr != nil {
api.SendBadRequest(c, "Take and Skip query parameters must be positive numbers.")
return return
} }