From 6ea5edb01750d7fc476a093264b89f300aab2f6a Mon Sep 17 00:00:00 2001 From: nquidox Date: Sun, 6 Jul 2025 18:16:03 +0300 Subject: [PATCH] added: pagination package --- pkg/pagination/dto.go | 22 ++++++++++++++++++++++ pkg/pagination/handler.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 pkg/pagination/dto.go create mode 100644 pkg/pagination/handler.go diff --git a/pkg/pagination/dto.go b/pkg/pagination/dto.go new file mode 100644 index 0000000..55bc58c --- /dev/null +++ b/pkg/pagination/dto.go @@ -0,0 +1,22 @@ +package pagination + +type QueryParams struct { + Query string + Page int + Limit int +} + +type Response struct { + Pagination Pagination `json:"pagination"` + Data any `json:"data"` +} + +type Pagination struct { + Page int `json:"page"` + PerPage int `json:"per_page"` + Total int `json:"total"` + TotalPages int `json:"total_pages"` + HasNext bool `json:"has_next"` + HasPrev bool `json:"has_prev"` + OverallCount int `json:"overall_count,omitempty"` +} diff --git a/pkg/pagination/handler.go b/pkg/pagination/handler.go new file mode 100644 index 0000000..20b9cbe --- /dev/null +++ b/pkg/pagination/handler.go @@ -0,0 +1,35 @@ +package pagination + +import "math" + +type Params struct { + Page int + PerPage int + TotalCount int + TotalPages int + OverallCount int +} + +func PrepareParams(params *Params) *Params { + totalPages := int(math.Ceil(float64(params.TotalCount) / float64(params.PerPage))) + params.TotalPages = totalPages + + if params.Page > totalPages { + params.Page = totalPages + } + return params +} + +func PaginatedResponse(data any, params *Params) *Response { + pagination := Pagination{ + Page: params.Page, + PerPage: params.PerPage, + Total: params.TotalCount, + TotalPages: params.TotalPages, + HasNext: params.Page < params.TotalPages, + HasPrev: params.Page > 1, + OverallCount: params.OverallCount, + } + + return &Response{Pagination: pagination, Data: data} +}