pagination

package
v2.8.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 19, 2026 License: BSD-3-Clause Imports: 9 Imported by: 0

Documentation

Index

Constants

View Source
const UnknownTotal int64 = -1

UnknownTotal is the sentinel returned in TotalItems/TotalPages when SkipCount is set.

Variables

This section is empty.

Functions

func ApplyBooleanFilter

func ApplyBooleanFilter(q *gorm.DB, column string, value string) *gorm.DB

ApplyBooleanFilter adds a WHERE clause for boolean columns. It detects comma-separated values and maps "true"/"1" to true and "false"/"0" to false.

func ApplyFilter

func ApplyFilter(q *gorm.DB, column string, value string) *gorm.DB

ApplyFilter adds a WHERE clause to the GORM query. It detects comma-separated values and uses IN (?) for multiple values, or = ? for single values.

func ApplyLikeSearch

func ApplyLikeSearch(q *gorm.DB, search string, condition string) *gorm.DB

ApplyLikeSearch adds a LIKE search condition using the same wildcard pattern for every placeholder in condition.

func MatchesSearchAndFilters added in v2.8.0

func MatchesSearchAndFilters[T any](item T, params QueryParams, config Config[T]) bool

MatchesSearchAndFilters reports whether a single item passes params' search term and filters under config — the same predicate SearchOrderAndPaginate applies. It lets callers that decode large payloads incrementally drop non-matching items as they go instead of materializing everything first.

func OrderAndPaginate added in v2.8.0

func OrderAndPaginate[T any](items []T, params QueryParams, config Config[T]) []T

OrderAndPaginate sorts items and slices the requested page without applying the search term or filters — for callers that already filtered while building the item list (e.g. dropping non-matches during an incremental decode) and only need ordering plus the page cut.

Types

type Config

type Config[T any] struct {
	SearchAccessors []SearchAccessor[T]
	SortBindings    []SortBinding[T]
	FilterAccessors []FilterAccessor[T]
}

type FilterAccessor

type FilterAccessor[T any] struct {
	Key string
	Fn  func(item T, filterValue string) bool
}

type FilterResult

type FilterResult[T any] struct {
	Items          []T
	TotalCount     int64
	TotalAvailable int64
}

func SearchOrderAndPaginate

func SearchOrderAndPaginate[T any](items []T, params QueryParams, searchConfig Config[T]) FilterResult[T]

type Params

type Params struct {
	Start int
	Limit int
	// SkipCount opts out of the COUNT(*) query that backs TotalItems/TotalPages.
	// When true, paginated DB helpers return UnknownTotal (-1) for both fields and
	// the response is suitable for infinite-scroll UIs that don't render page numbers.
	// Default (false) preserves the historical behaviour for all existing callers.
	SkipCount bool
}

type QueryParams

type QueryParams struct {
	SearchQuery
	SortParams
	Params

	Filters map[string]string
}

type Response

type Response struct {
	TotalPages      int64 `json:"totalPages"`
	TotalItems      int64 `json:"totalItems"`
	CurrentPage     int   `json:"currentPage"`
	ItemsPerPage    int   `json:"itemsPerPage"`
	GrandTotalItems int64 `json:"grandTotalItems,omitempty"`
}

func BuildResponse added in v2.8.0

func BuildResponse(totalCount int64, totalAvailable int64, params QueryParams) Response

BuildResponse creates a pagination Response from raw counts. Handles the special case where limit = -1 means "show all".

func PaginateAndSortDB

func PaginateAndSortDB(params QueryParams, query *gorm.DB, result any) (Response, error)

func PaginateSortAndMapDB

func PaginateSortAndMapDB[M any, D any](params QueryParams, query *gorm.DB, records *[]M) ([]D, Response, error)

PaginateSortAndMapDB paginates DB records and maps them to API DTOs.

type SearchAccessor

type SearchAccessor[T any] = func(T) (string, error)

SearchAccessor extracts a searchable string from T. Return any error to skip the field (e.g. when matching an unknown enum state).

Note: returning ("", nil) will match!

type SearchQuery

type SearchQuery struct {
	Search string
}

type SortBinding

type SortBinding[T any] struct {
	Key    string
	Fn     SortOption[T]
	DescFn SortOption[T]
}

type SortOption

type SortOption[T any] func(a, b T) int

type SortOrder

type SortOrder string
const (
	SortAsc  SortOrder = "asc"
	SortDesc SortOrder = "desc"
)

type SortParams

type SortParams struct {
	Sort  string
	Order SortOrder
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL