How to implement mutations with optional arguments in GraphQL?

I am learning about graphql, and went through the www.howtographql.com/graphql-js/3-a-simple-mutation/ tutorial, and was interested in what the implementation of the updateLink mutation as follows would look like.

type Query {
  # Fetch a single link by its `id`
  link(id: ID!): Link
}

type Mutation {
  # Update a link
  updateLink(id: ID!, url: String, description: String): Link
}

The reason I am asking this is that every other mutation implementation I have seen uses only NON-optional parameters. I am curious if there is a community-agreed-upon pattern for extracting and applying only the provided non-null arguments(url, description) from the given context and applying them to relevant the database record.

I have considered checking if each variable is null as follows, but this approach looks way messier than I would expect compared to the rest of the ‘magic’ and simplicity that Graphql provides.

        updateLink(root, args, context) {
            if (args.url == null && args.description == null){
                return null
            } else if (args.url == null) {
                return context.prisma.updateLink({
                    id: args.id,
                    description: args.description
                })
            } else {
                return context.prisma.updateLink({
                    id: args.id,
                    url: args.url
                })
            }
        }

Please let me know if you found a cleaner way to extract and apply the optional arguments(url, description).

Another consideration I had was to make two separate update mutations as follows.

type Query {
  # Fetch a single link by its `id`
  link(id: ID!): Link
}

type Mutation {
  # Update a link
  updateLinkURL(id: ID!, url: String!): Link
  updateLinkDescription(id: ID!, description: String!): Link
}

The thinking here was with limited arguments and a declarative mutation name, one could force the arguments to be Non-Null. The main issue here is that one can have many update methods for tables with many columns, this would also start to look messy.

FYI I am using prisma as my ORM.

Read more here: Source link