Plugin for `graphql-compose` which provide a connection resolver for types.
npm install graphql-compose-connection




This is a plugin for graphql-compose family, which adds to the ObjectTypeComposer connection resolver.
Live demo: https://graphql-compose.herokuapp.com/
This package completely follows to Relay Cursor Connections Specification (
Besides standard connection arguments first, last, before and after, also added significant arguments:
- filter arg - for filtering records
- sort arg - for sorting records. Build in mechanism allows sort by any unique indexes (not only by id). Also supported compound sorting (by several fields).
``bash`
npm install graphql graphql-compose graphql-compose-connection --save
Modules graphql and graphql-compose are in peerDependencies, so should be installed explicitly in your app. They should not installed as submodules, cause internally checks the classes instances.
Implementation details of findManyResolver and countResolver can be found in this file.
`js
import { prepareConnectionResolver } from 'graphql-compose-connection';
import { UserTC, findManyResolver, countResolver } from './user';
prepareConnectionResolver(userTC, {
findManyResolver,
countResolver,
sort: {
// Sorting key, visible for users in GraphQL Schema
_ID_ASC: {
// Sorting value for ORM/Driver
value: { _id: 1 },
// Field names in record, which data will be packed in cursorcursorData
// edges {
// cursor <- base64(cursorData), for this example = { _id: 334ae453 }
// node <- record from DB
// }
// By this fields MUST be created UNIQUE index in database!
cursorFields: ['_id'],
// If for connection query provided before argument with above cursor.rawQuery
// We should construct () which will be point to dataset before cursor.cursor
// Unpacked data from will be available in (cursorData) argument.value
// PS. All other filter options provided via GraphQL query will be added automatically.
// ----- [record] ----- sorted dataset, according to above option with namerawQuery
// ^^^^^ should filter this set
beforeCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery._id) rawQuery._id = {};
rawQuery._id.$lt = cursorData._id;
},
// Constructing rawQuery for connection after argument.rawQuery
// ----- [record] ----- sorted dataset
// ^^^^^ should filter this set
afterCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery._id) rawQuery._id = {};
rawQuery._id.$gt = cursorData._id;
},
},
_ID_DESC: {
value: { _id: -1 },
cursorFields: ['_id'],
beforeCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery._id) rawQuery._id = {};
rawQuery._id.$gt = cursorData._id;
},
afterCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery._id) rawQuery._id = {};
rawQuery._id.$lt = cursorData._id;
},
},
// More complex sorting parameter with 2 fields
AGE_ID_ASC: {
value: { age: 1, _id: -1 },
// By these fields MUST be created COMPOUND UNIQUE index in database!
cursorFields: ['age', '_id'],
beforeCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery.age) rawQuery.age = {};
if (!rawQuery._id) rawQuery._id = {};
rawQuery.age.$lt = cursorData.age;
rawQuery._id.$gt = cursorData._id;
},
afterCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery.age) rawQuery.age = {};
if (!rawQuery._id) rawQuery._id = {};
rawQuery.age.$gt = cursorData.age;
rawQuery._id.$lt = cursorData._id;
},
}
},
});
``

graphql-compose-mongoose - converts mongoose models to graphql types