Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GraphQL REST Connections

Build Status NPM version

This library helps with pagination in GraphQL, when backed by REST services.

It will convert a Connection object, as defined by the Cursor Connection Specification:

{
  "edges": [{
    "cursor": "d02dsf",
    "node": {"id": "56", "name": "mary"}
  }, {
    "cursor": "b8df4=",
    "node": {"id": "78", "name": "joe"}
  }],
  "pageInfo": {
    "startCursor": "d02dsf",
    "endCursor": "b8df4=",
    "hasNextPage": true,
    "hasPreviousPage": false
  }
}

and turn it into a list of headers and nodes, so that it could easily be returned by a RESTful service:

GET /users
Content-Type: application/json
x-pageinfo-start-cursor: d02dsf
x-pageinfo-end-cursor: b8df4=
x-pageinfo-has-previous-page: true
x-pageinfo-has-next-page: false
x-pageinfo-cursors: d02dsf,b8df4=

[
  {"id": "56", "name": "mary"},
  {"id": "78", "name": "joe"}
]

Note that the returned objects is a list of resources that are exactly the same as ones you would get from /users/78 (for example). The pagination info goes inside the pageinfo headers.

Usage

  • isConnection(object) -- determines whether the object is a Connection
  • fromConnection(connection) -- returns {nodes: [], headers: []}
  • toConnection(nodes, headers) -- returns a connection

In a REST service:

app.get('/users', (req, res, next) => {
  service.getUserConnections(req.query)
    .catch(next)
    .then(connection => {
      const {nodes, headers} = fromConnection(connection);
      res.set(headers);
      res.json(nodes);
    });
});

In GraphQL service that is backed by the REST service above:

const userConnections = {
  type: userConnection,
  args: connectionArgs,
  resolve: ((_, args) => {
    requestPromise.get({
      uri: USER_SERVICE_URI,
      qs: args,
      json: true,
      resolveWithFullResponse: true
    })
    .then(res => toConnection(res.body, res.headers));
  })
};

Related

GraphQL DynamoDB Connections

License

MIT

About

This library helps with pagination in GraphQL, when backed by REST services.

Resources

Stars

16 stars

Watchers

27 watching

Forks

Releases

Packages

Used by

Contributors

Languages