Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I set up GraphQL query so one or another argument is required, but not both

I'm just getting to grips with GraphQL,

I have set up the following query: ​

type: UserType,
args: {
    id:    { name: 'id',    type: new GraphQLNonNull(GraphQLID)     },
    email: { name: 'email', type: new GraphQLNonNull(GraphQLString) }
},
resolve: (root, { id, email }, { db: { User } }, fieldASTs) => {
    ...
}

I would like to be able to pass either an 'id' or 'email' to the query, however, with this setup it requires both an id and email to be passed.

Is there a way to set up the query so only one argument is required, either id or email, but not both?

like image 407
Joe Wearing Avatar asked Sep 12 '17 23:09

Joe Wearing


1 Answers

There's no built-in way to do that in GraphQL. You need to make your arguments nullable (by removing the GraphQLNonNull wrapper type from both of them) and then, inside your resolver, you can just do a check like:

resolve: (root, { id, email }, { db: { User } }, fieldASTs) => {
  if (!id && !email) return Promise.reject(new Error('Must pass in either an id or email'))
  if (id && email) return Promise.reject(new Error('Must pass in either an id or email, but not both.'))
  // the rest of your resolver
}
like image 127
Daniel Rearden Avatar answered Sep 28 '22 02:09

Daniel Rearden