Files
apocapoc-api/internal/shared/pagination/pagination.go
T
david 38e640c617 Add pagination support to GET /api/v1/habits endpoint
- Create pagination package with Params and Response structs
- Add FindActiveByUserIDWithPagination and CountActiveByUserID methods to HabitRepository interface
- Implement pagination in SQLite repository using LIMIT and OFFSET
- Update GetUserHabitsHandler to support optional pagination parameters
- Modify HTTP endpoint to parse 'page' and 'page_size' query params (default: page=1, page_size=50, max=100)
- Add GetUserHabitsResponse DTO with pagination metadata
- Maintain backward compatibility - endpoint works with and without pagination params
- Add comprehensive tests for pagination logic in repository, handler, and pagination package
- Update all mock repositories to implement new pagination methods
2025-12-01 23:53:00 +01:00

55 lines
904 B
Go

package pagination
type Params struct {
Page int
PageSize int
}
func NewParams(page, pageSize int) Params {
if page < 1 {
page = 1
}
if pageSize < 1 {
pageSize = 50
}
if pageSize > 100 {
pageSize = 100
}
return Params{
Page: page,
PageSize: pageSize,
}
}
func (p Params) Offset() int {
return (p.Page - 1) * p.PageSize
}
func (p Params) Limit() int {
return p.PageSize
}
type Response struct {
Page int `json:"page"`
PageSize int `json:"page_size"`
TotalItems int `json:"total_items"`
TotalPages int `json:"total_pages"`
}
func NewResponse(params Params, totalItems int) Response {
totalPages := totalItems / params.PageSize
if totalItems%params.PageSize > 0 {
totalPages++
}
if totalPages < 1 {
totalPages = 1
}
return Response{
Page: params.Page,
PageSize: params.PageSize,
TotalItems: totalItems,
TotalPages: totalPages,
}
}