Documentation
Basics
Handling lists

Lists

In fuse we offer two types of lists when building fields t.list and t.connection. The difference between the two is their specialization, t.connection is specialised towards cursor-based pagination and t.list is more general purpose.

List

When using the list type as followed:

import { addQueryFields } from 'fuse'
 
addQueryFields((t) => ({
  users: t.list({
    type: UserNode,
    nullable: false,
    args: {
      offset: t.arg.int(),
      limit: t.arg.int(),
    },
    resolve: async (_, args, context) => {
      const result = await getUsers({
        skip: args.offset,
        take: args.limit,
      })
 
      return {
        // It's also possible to return a list of ids here in case your
        // list endpoint doesn't have all the needed details of the user
        // then the node will resolve the rest of the entity.
        nodes: result.users,
        totalCount: result.totalCount,
      }
    },
  }),
}))

For the above, we get a GraphQL type like this:

type UserList {
  nodes: [User]!
  totalCount: Int
}
 
type Query {
  users(limit: Int, offset: Int): UserList!
}

The nodes will output the type you specify the list to return, the totalCount has been made optional on purpose in case your datasource does not return this information.

Connection

When using the connection type as followed:

import { addQueryFields } from 'fuse'
 
addQueryFields((t) => ({
  users: t.connection({
    type: UserNode,
    nullable: false,
    resolve: async (_, args, context) => {
      const result = await getUsers({
        skip: args.offset,
        take: args.limit,
      })
 
      return {
        edges: result.users.map(user => ({
          node: user,
          cursor: user.id,
        })),
        pageInfo: getPageInfo(result),
      }
    },
  }),
}))

For the above, we get a GraphQL type like this:

type UserEdge {
  cursor: String!
  node: User!
}
 
type PageInfo {
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
  startCursor: String!
  endCursor: String!
}
 
type UserConnection {
  edges: [UserEdge]!
  pageInfo: PageInfo!
}
 
type Query {
  ## Note that the arguments for cursor-based pagination are included automatically
  users(after: String, before: String, first: Int, last: Int): QueryLaunchesConnection!
}

As you can see, this type is a lot more in-depth and gears towards cursor-based pagination. The edges can be customised to for instance carry relational attributes, this could for instance be the role of the user in relation to the parent where this connection is being queried from.