Class: GraphQL::Relay::GlobalNodeIdentification
- Inherits:
-
Object
- Object
- GraphQL::Relay::GlobalNodeIdentification
- Includes:
- Define::InstanceDefinable
- Defined in:
- lib/graphql/relay/global_node_identification.rb
Overview
This object provides helpers for working with global IDs. It’s assumed you’ll only have 1!
GlobalIdField depends on that, since it calls class methods which delegate to the singleton instance.
Constant Summary collapse
- DEFAULT_TO_GLOBAL_ID =
-> (type_name, id) { id_str = id.to_s if type_name.include?(self.id_separator) || id_str.include?(self.id_separator) raise "to_global_id(#{type_name}, #{id}) contains reserved characters `#{self.id_separator}`" end Base64.strict_encode64([type_name, id_str].join(self.id_separator)) }
- DEFAULT_FROM_GLOBAL_ID =
-> (global_id) { Base64.decode64(global_id).split(self.id_separator) }
Class Attribute Summary collapse
-
.id_separator ⇒ Object
Returns the value of attribute id_separator.
-
.instance ⇒ Object
Returns the value of attribute instance.
Class Method Summary collapse
Instance Method Summary collapse
-
#field ⇒ Object
Returns a field for finding objects from a global ID, which Relay needs.
-
#from_global_id(global_id) ⇒ Object
Get type-name & ID from global ID (This reverts the opaque transform).
- #from_global_id=(proc) ⇒ Object
-
#initialize ⇒ GlobalNodeIdentification
constructor
A new instance of GlobalNodeIdentification.
-
#interface ⇒ Object
Returns ‘NodeInterface`, which all Relay types must implement.
-
#object_from_id(id, ctx) ⇒ Object
Use the provided config to get an object from a UUID.
- #object_from_id=(proc) ⇒ Object
-
#to_global_id(type_name, id) ⇒ Object
Create a global ID for type-name & ID (This is an opaque transform).
- #to_global_id=(proc) ⇒ Object
-
#type_from_object(object) ⇒ Object
Use the provided config to get a type for a given object.
- #type_from_object=(proc) ⇒ Object
Constructor Details
#initialize ⇒ GlobalNodeIdentification
Returns a new instance of GlobalNodeIdentification.
31 32 33 34 |
# File 'lib/graphql/relay/global_node_identification.rb', line 31 def initialize @to_global_id_proc = DEFAULT_TO_GLOBAL_ID @from_global_id_proc = DEFAULT_FROM_GLOBAL_ID end |
Class Attribute Details
.id_separator ⇒ Object
Returns the value of attribute id_separator.
15 16 17 |
# File 'lib/graphql/relay/global_node_identification.rb', line 15 def id_separator @id_separator end |
.instance ⇒ Object
Returns the value of attribute instance.
15 16 17 |
# File 'lib/graphql/relay/global_node_identification.rb', line 15 def instance @instance end |
Class Method Details
.from_global_id(id) ⇒ Object
20 21 22 |
# File 'lib/graphql/relay/global_node_identification.rb', line 20 def from_global_id(id) instance.from_global_id(id) end |
.new(*args, &block) ⇒ Object
16 17 18 |
# File 'lib/graphql/relay/global_node_identification.rb', line 16 def new(*args, &block) @instance = super end |
.to_global_id(type_name, id) ⇒ Object
24 25 26 |
# File 'lib/graphql/relay/global_node_identification.rb', line 24 def to_global_id(type_name, id) instance.to_global_id(type_name, id) end |
Instance Method Details
#field ⇒ Object
Returns a field for finding objects from a global ID, which Relay needs
51 52 53 54 55 56 57 58 59 60 |
# File 'lib/graphql/relay/global_node_identification.rb', line 51 def field ident = self GraphQL::Field.define do type(ident.interface) argument :id, !types.ID resolve -> (obj, args, ctx) { ident.object_from_id(args[:id], ctx) } end end |
#from_global_id(global_id) ⇒ Object
Get type-name & ID from global ID (This reverts the opaque transform)
86 87 88 |
# File 'lib/graphql/relay/global_node_identification.rb', line 86 def from_global_id(global_id) @from_global_id_proc.call(global_id) end |
#from_global_id=(proc) ⇒ Object
90 91 92 |
# File 'lib/graphql/relay/global_node_identification.rb', line 90 def from_global_id=(proc) @from_global_id_proc = proc end |
#interface ⇒ Object
Returns ‘NodeInterface`, which all Relay types must implement
37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/graphql/relay/global_node_identification.rb', line 37 def interface @interface ||= begin ident = self GraphQL::InterfaceType.define do name "Node" field :id, !types.ID resolve_type -> (obj) { ident.type_from_object(obj) } end end end |
#object_from_id(id, ctx) ⇒ Object
Use the provided config to get an object from a UUID
112 113 114 |
# File 'lib/graphql/relay/global_node_identification.rb', line 112 def object_from_id(id, ctx) @object_from_id_proc.call(id, ctx) end |
#object_from_id=(proc) ⇒ Object
116 117 118 |
# File 'lib/graphql/relay/global_node_identification.rb', line 116 def object_from_id=(proc) @object_from_id_proc = proc end |
#to_global_id(type_name, id) ⇒ Object
Create a global ID for type-name & ID (This is an opaque transform)
76 77 78 |
# File 'lib/graphql/relay/global_node_identification.rb', line 76 def to_global_id(type_name, id) @to_global_id_proc.call(type_name, id) end |
#to_global_id=(proc) ⇒ Object
80 81 82 |
# File 'lib/graphql/relay/global_node_identification.rb', line 80 def to_global_id=(proc) @to_global_id_proc = proc end |
#type_from_object(object) ⇒ Object
Use the provided config to get a type for a given object
96 97 98 99 100 101 102 103 104 |
# File 'lib/graphql/relay/global_node_identification.rb', line 96 def type_from_object(object) type_result = @type_from_object_proc.call(object) if !type_result.is_a?(GraphQL::BaseType) type_str = "#{type_result} (#{type_result.class.name})" raise "type_from_object(#{object}) returned #{type_str}, but it should return a GraphQL type" else type_result end end |
#type_from_object=(proc) ⇒ Object
106 107 108 |
# File 'lib/graphql/relay/global_node_identification.rb', line 106 def type_from_object=(proc) @type_from_object_proc = proc end |