Skip to content

Instantly share code, notes, and snippets.

@rmosolgo
Last active September 29, 2021 15:51
Show Gist options
  • Save rmosolgo/49fdf9bb4e2bb9f30b44fa3ad46549cd to your computer and use it in GitHub Desktop.
Save rmosolgo/49fdf9bb4e2bb9f30b44fa3ad46549cd to your computer and use it in GitHub Desktop.
require "bundler/inline"
gemfile do
gem "graphql", "~>1.12.0"
end
class BaseField < GraphQL::Schema::Field
def initialize(*args, federated: true, **kwargs, &block)
@federated = federated
super(*args, **kwargs, &block)
end
def visible?(context)
if context[:federated] && @federated == false
false
else
true
end
end
end
class BaseObject < GraphQL::Schema::Object
def self.visible?(context)
if context[:federated] && @federated == false
false
else
true
end
end
def self.federated(new_config = nil)
if new_config.nil?
@federated
else
@federated = new_config
end
end
end
class NonFederatedObject < BaseObject
federated(false)
field :int, Int, null: true
end
class Query < GraphQL::Schema::Object
field_class BaseField
field :shared_field, Int, null: true
field :hidden_field, Int, null: true, federated: false
field :non_federated_object, NonFederatedObject, null: true
end
class Schema < GraphQL::Schema
query(Query)
end
puts "Whole schema:\n-----------------"
puts Schema.to_definition
puts "\n\nFederated schema:\n-----------------"
puts Schema.to_definition(context: { federated: true })
# $ ruby visibility_test.rb
# Whole schema:
# -----------------
# type NonFederatedObject {
# int: Int
# }
#
# type Query {
# hiddenField: Int
# nonFederatedObject: NonFederatedObject
# sharedField: Int
# }
#
#
# Federated schema:
# -----------------
# type Query {
# sharedField: Int
# }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment