Module: ElasticGraph::SchemaDefinition::Mixins::HasDerivedGraphQLTypeCustomizations

Included in:
SchemaElements::EnumType, SchemaElements::ScalarType, SchemaElements::TypeWithSubfields, SchemaElements::UnionType
Defined in:
lib/elastic_graph/schema_definition/mixins/has_derived_graphql_type_customizations.rb

Overview

Mixin that supports the customization of derived GraphQL types.

For each type you define, ElasticGraph generates a number of derived GraphQL types that are needed to facilitate the ElasticGraph Query API. Methods in this module can be used to customize those derived GraphQL types.

Instance Method Summary collapse

Instance Method Details

#customize_derived_type_fields(type_name, *field_names, &customization_block) ⇒ void

This method returns an undefined value.

Registers a customization block for the named fields on the named derived GraphQL type. The provided block will get run on the named fields of the named derived GraphQL type, allowing them to be customized.

Examples:

Customize named fields of a derived GraphQL type

ElasticGraph.define_schema do |schema|
  schema.object_type "Campaign" do |t|
    t.field "id", "ID!"
    t.index "campaigns"

    t.customize_derived_type_fields "CampaignConnection", "pageInfo", "totalEdgeCount" do |dt|
      # Add a `@deprecated` directive to `CampaignConnection.pageInfo` and `CampaignConnection.totalEdgeCount`.
      dt.directive "deprecated"
    end
  end
end

Parameters:

  • type_name (String)

    name of the derived type containing fields you want to customize

  • field_names (Array<String>)

    names of the fields on the derived types that you wish to customize



77
78
79
80
81
82
83
# File 'lib/elastic_graph/schema_definition/mixins/has_derived_graphql_type_customizations.rb', line 77

def customize_derived_type_fields(type_name, *field_names, &customization_block)
  customizations_by_field = derived_field_customizations_by_type_and_field_name[type_name]

  field_names.each do |field_name|
    customizations_by_field[field_name] << customization_block
  end
end

#customize_derived_types(*type_names, &customization_block) ⇒ void

This method returns an undefined value.

Registers a customization block for the named derived graphql types. The provided block will get run on the named derived GraphQL types, allowing them to be customized.

Examples:

Customize named derived GraphQL types

ElasticGraph.define_schema do |schema|
  schema.object_type "Campaign" do |t|
    t.field "id", "ID!"
    t.index "campaigns"

    t.customize_derived_types "CampaignFilterInput", "CampaignSortOrderInput" do |dt|
      # Add a `@deprecated` directive to two specific derived types.
      dt.directive "deprecated"
    end
  end
end

Customize all derived GraphQL types

ElasticGraph.define_schema do |schema|
  schema.object_type "Campaign" do |t|
    t.field "id", "ID!"
    t.index "campaigns"

    t.customize_derived_types :all do |dt|
      # Add a `@deprecated` directive to all derived types.
      dt.directive "deprecated"
    end
  end
end

Parameters:

  • type_names (Array<String, :all>)

    names of the derived types to customize, or ‘:all` to customize all derived types



48
49
50
51
52
53
54
55
56
# File 'lib/elastic_graph/schema_definition/mixins/has_derived_graphql_type_customizations.rb', line 48

def customize_derived_types(*type_names, &customization_block)
  if type_names.include?(:all)
    derived_type_customizations_for_all_types << customization_block
  else
    type_names.each do |t|
      derived_type_customizations_by_name[t.to_s] << customization_block
    end
  end
end

#derived_field_customizations_by_name_for_type(type) ⇒ Object



91
92
93
# File 'lib/elastic_graph/schema_definition/mixins/has_derived_graphql_type_customizations.rb', line 91

def derived_field_customizations_by_name_for_type(type)
  derived_field_customizations_by_type_and_field_name[type.name]
end

#derived_field_customizations_by_type_and_field_nameObject



103
104
105
106
107
108
109
# File 'lib/elastic_graph/schema_definition/mixins/has_derived_graphql_type_customizations.rb', line 103

def derived_field_customizations_by_type_and_field_name
  @derived_field_customizations_by_type_and_field_name ||= ::Hash.new do |outer_hash, type|
    outer_hash[type] = ::Hash.new do |inner_hash, field_name|
      inner_hash[field_name] = []
    end
  end
end

#derived_type_customizations_by_nameObject



96
97
98
99
100
# File 'lib/elastic_graph/schema_definition/mixins/has_derived_graphql_type_customizations.rb', line 96

def derived_type_customizations_by_name
  @derived_type_customizations_by_name ||= ::Hash.new do |hash, type_name|
    hash[type_name] = []
  end
end

#derived_type_customizations_for_type(type) ⇒ Object



86
87
88
# File 'lib/elastic_graph/schema_definition/mixins/has_derived_graphql_type_customizations.rb', line 86

def derived_type_customizations_for_type(type)
  derived_type_customizations_by_name[type.name] + derived_type_customizations_for_all_types
end