# README
go-paging 
Go pagination for SQLBoiler and gqlgen (GraphQL).
Install
go get -u "github.com/nrfta/go-paging"
Usage
-
Add this GraphQL schema to your project.
-
Add models to
gqlgen.yml
:
models:
PageArgs:
model: github.com/nrfta/go-paging.PageArgs
PageInfo:
model: github.com/nrfta/go-paging.PageInfo
- Add PageInfo Resolver for gqlgen
package resolvers
import (
"github.com/nrfta/go-paging"
)
func (r *RootResolver) PageInfo() PageInfoResolver {
return paging.NewPageInfoResolver()
}
- Full Example
This assumes you have the following GraphQL schema:
type Post {
id: ID!
name: String
}
type PostEdge {
cursor: String
node: Post!
}
type PostConnection {
edges: [PostEdge!]!
pageInfo: PageInfo!
}
type Query {
posts(page: PageArgs): PostConnection!
}
Note that PageArgs and PageInfo is defined in schema.graphql and your should copy it to your project.
Here is what the resolver function would look like:
package resolvers
import (
"context"
"github.com/nrfta/go-paging"
"github.com/volatiletech/sqlboiler/v4/queries/qm"
"github.com/my-user/my-app/models"
)
func (r *queryResolver) Posts(ctx context.Context, page *paging.PageArgs) (*PostConnection, error) {
var mods []qm.QueryMod
totalCount, err := models.Posts().Count(ctx, DB)
if err != nil {
return &PostConnection{
PageInfo: paging.NewEmptyPageInfo(),
}, err
}
paginator := paging.NewOffsetPaginator(page, totalCount)
mods = append(mods, paginator.QueryMods()...)
records, err := models.Posts(mods...).All(ctx, DB)
if err != nil {
return &PostConnection{
PageInfo: paging.NewEmptyPageInfo(),
}, err
}
result := &PostConnection{
PageInfo: &paginator.PageInfo,
}
for i, row := range records {
result.Edges = append(result.Edges, &PostEdge{
Cursor: paging.EncodeOffsetCursor(paginator.Offset + i + 1),
Node: row,
})
}
return result, nil
}
License
This project is licensed under the MIT License.
# Packages
No description provided by the author
# Functions
DecodeOffsetCursor takes a base64 string and decotes it to extract the offset from a string based on "cursor:offset:NUMBER".
EncodeOffsetCursor takes an integer and encodes to a base64 string as "cursor:offset:NUMBER".
NewEmptyPageInfo returns a empty instance of PageInfo.
NewOffsetBasedPageInfo returns a new PageInfo object with data filled in, based on offset pagination.
NewOffsetPaginator creates a new offset paginator.
NewPageInfoResolver returns the resolver for PageInfo.
No description provided by the author
# Structs
OffsetPaginator is the paginator for offset based pagination.
PageArgs is used as the query inputs.
PageInfo is the base struct for building PageInfo.
# Interfaces
PageInfoResolver interface.