API Reference

Constants

const (
    DefaultPage       = 1
    DefaultSize       = 10
    MaxSize           = 1000
    DefaultCursorSize = 10
    MaxCursorSize     = 1000
)

Sort

Types

type Direction string

const (
    ASC  Direction = "asc"
    DESC Direction = "desc"
)

type Sort struct {
    Field     string
    Direction Direction
}

Functions

FunctionSignatureDescription
ParseSort(raw string) *SortParse a single "field,direction" string
ParseSorts(raw []string) []SortParse multiple sort strings
Sort.String() stringReturns "field,direction" format

PageRequest

Type

type PageRequest struct {
    Page int
    Size int
    Sort []Sort
}

Constructors

FunctionSignatureDescription
NewPageRequest(page, size int, sort []Sort) PageRequestCreate with clamping
PageRequestFromQuery(values url.Values) PageRequestParse from query params

Methods

MethodSignatureDescription
Offset() int(Page - 1) * Size
Limit() intReturns Size
SortableFields(fields ...string) PageRequestWhitelist sort fields
MapSortFields(fieldMap map[string]string) PageRequestMap user-facing field names to database columns
WithDefaultSort(sorts ...Sort) PageRequestSet fallback sort
OrderBy() string"field dir, field dir"

Page[T]

Types

type Page[T any] struct {
    Items    []T          `json:"items"`
    Metadata PageMetadata `json:"metadata"`
}

type PageMetadata struct {
    Page       int   `json:"page"`
    Size       int   `json:"size"`
    TotalItems int64 `json:"totalItems"`
    TotalPages int   `json:"totalPages"`
}

Functions

FunctionSignatureDescription
NewPage(items []T, request PageRequest, totalItems int64) Page[T]Create with computed metadata
EmptyPage(request PageRequest) Page[T]Create empty page with zero results

CursorRequest

Type

type CursorRequest struct {
    Cursor string
    Size   int
    Sort   []Sort
}

Constructors

FunctionSignatureDescription
NewCursorRequest(cursor string, size int, sort []Sort) CursorRequestCreate with clamping
CursorRequestFromQuery(values url.Values) CursorRequestParse from query params

Methods

MethodSignatureDescription
Limit() intReturns Size + 1 (fetch extra to detect hasNext)
HasCursor() boolTrue if cursor is non-empty
DecodedCursor() (CursorData, error)Decode the cursor token
SortableFields(fields ...string) CursorRequestWhitelist sort fields
MapSortFields(fieldMap map[string]string) CursorRequestMap user-facing field names to database columns
WithDefaultSort(sorts ...Sort) CursorRequestSet fallback sort
OrderBy() string"field dir, field dir"

CursorPage[T]

Types

type CursorPage[T any] struct {
    Items    []T                `json:"items"`
    Metadata CursorPageMetadata `json:"metadata"`
}

type CursorPageMetadata struct {
    NextCursor string `json:"nextCursor"`
    PrevCursor string `json:"prevCursor"`
    HasNext    bool   `json:"hasNext"`
    HasPrev    bool   `json:"hasPrev"`
    Size       int    `json:"size"`
}

Functions

FunctionSignatureDescription
NewCursorPage(items []T, nextCursor, prevCursor string, hasNext, hasPrev bool, size int) CursorPage[T]Create cursor page
EmptyCursorPage(size int) CursorPage[T]Create empty cursor page

Cursor Encoding

Types

type CursorDirection string

const (
    Next CursorDirection = "next"
    Prev CursorDirection = "prev"
)

type CursorData struct {
    Value     string            `json:"v"`
    Direction CursorDirection   `json:"d"`
    Extra     map[string]string `json:"e"`
}

Functions

FunctionSignatureDescription
EncodeCursor(data CursorData) (string, error)Encode to base64 URL-safe token
DecodeCursor(cursor string) (CursorData, error)Decode from base64 token