graphql-cursor
v1.0.9
Published
A Relay cursor pagination plugin for mongoose schema.
Downloads
6
Maintainers
Readme
A Relay cursor pagination plugin for mongoose schema.
Install
$ npm i graphql-cursor
Usage
You can see how to implement pagination in this example
GraphQL model/controller
// graphql-model.js
export default async (_parent, args, model) => model.paginateResult({}, args);
This will gives you the following response:
{
"edges": [
{ "cursor": "...", "node": { ... } },
{ "cursor": "...", "node": { ... } },
{ "cursor": "...", "node": { ... } },
{ "cursor": "...", "node": { ... } },
{ "cursor": "...", "node": { ... } }
],
"pageInfo": {
"startCursor": "...",
"endCursor": "...",
"hasNextPage": false,
"hasPreviousPage": false
}
"totalCount": 5,
}
API
model.paginateResult(query, args, options);
Query
The query is a basic mongoose query object.
model.paginateResult({ _id: "..." }, args, options);
Arguments
These are the arguments used to paginate the result. They usually are coming from the client. You can pass:
- after - If you want all the results after a specific cursor
- before - If you want all the results before a specific cursor
- first - Get the first n results
- last - Get the last n results
- orderBy - An object that contains the field and the way to sort the results
- filters - An object that contains filters if needed. You can give any number of filters you want as long as their keys are in the filterFields (see options below)
- search - A string to look for among the searchFields (see options below)
orderBy:
model.paginateResult({}, { orderBy: { field: "firstName", direction: "desc" } }, options);
filters:
model.paginateResult({}, { filters: { isAdmin: true } }, { filterFields: { isAdmin: true } });
Options
Options are here to customize the way you paginate your results. Here are the different options:
- select - A string that fetch only specific fields
- searchFields - An array of schema field names on which you allow searching
- sortables - An array of schema field names on which you allow sorting
- filterFields - An object that contains whitelisted filters and how to deal with them If you give a boolean value, it means that this field is allowed (or not if false) as a filter. It will result in a basic comparison. Let's consider the example below.
model.paginateResult(
{},
{ filters: { isModerator: true, isAdmin: true } },
{ filterFields: { filterFields: { isModerator: true, isAdmin: false } } }
);
In this case, GraphQL Cursor will accept two filters: isAdmin
and isModerator
. Name
and others will be ignored. So, if the client sends the filters defined below, Mongo will search for "users that are isModerator AND not isAdmin".
model.paginateResult(
{},
{ filters: { isModerator: true, isAdmin: false, name: "God" } },
{ filterFields: { filterFields: { isModerator: true, isAdmin: true, name: false, ... } } }
);