Skip to content

indoorway/shared-arguments

Repository files navigation

shared-arguments

Build Status

This gem allows share arguments within GraphQL fields for graphql-ruby.

Created by

Sponsored by Indoorway

Contents

Description

Sometimes you want to use the same arguments for multiple fields in custom object type. To avoid repeating those declarations and DRY-up your schema, I introduce you shared_arguments field.

This gem is mostly usable when you have:

  • many fields with few repeating arguments
  • few fields with many repeating arguments
  • many fields with many repeating arguments

Installation

gem install shared-arguments
require 'graphql/shared_arguments

With Gemfile

gem 'shared-arguments', require: 'graphql/shared_examples'

Setup

Include SharedArguments in your schema

#graphql/your_schema.rb

YourSchema = GraphQL::Schema.define do
  use GraphQL::SharedArguments.new
end

Sample use case

#graphql/types/analytics_type.rb

Types::AnalyticsType = GraphQL::ObjectType.define do
    name 'Analytics'
    
    field :invoices, types.[Types::Invoice] do
       argument :from, !Types::DateType
       argument :to, !Types::DateType
       argument :companyID, types.ID
    end
    
    field :registeredUsers, types.[Types::User] do
       argument :from, !Types::DateType
       argument :to, !Types::DateType
       argument :companyID, types.ID
    end
    
    field :downloadsAmount, types.Int do
       argument :from, !Types::DateType
       argument :to, !Types::DateType
       argument :userAmount, types.ID
    end
end

This can be shortened like in below example

#graphql/types/analytics_type.rb

Types::AnalyticsType = GraphQL::ObjectType.define do
    name 'Analytics'
    
    field :invoices, types.[Types::Invoice]
    
    field :registeredUsers, types.[Types::User]
    
    field :downloadsAmount, types.Int do
       argument :userAmount, types.ID
    end
    
    shared_arguments do
       argument :from, !Types::DateType
       argument :to, !Types::DateType
    end
    
    shared_arguments except: %i(downloadsAmount) do
       argument :companyID, types.ID
    end
end

shared_arguments field takes both except and only keyword with array of symbols so you can omit or select specified fields.

Any contributions/suggestions/opened issues are welcomed.

License: MIT