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 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.
21 22 23 24 |
# File 'lib/graphql/relay/global_node_identification.rb', line 21 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.
16 17 18 |
# File 'lib/graphql/relay/global_node_identification.rb', line 16 def id_separator @id_separator end |
Instance Method Details
#field ⇒ Object
Returns a field for finding objects from a global ID, which Relay needs
42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/graphql/relay/global_node_identification.rb', line 42 def field ensure_defined ident = self GraphQL::Field.define do type(ident.interface) argument :id, !types.ID resolve -> (obj, args, ctx) { ctx.query.schema.node_identification.object_from_id(args[:id], ctx) } description ident.description end end |
#from_global_id(global_id) ⇒ Object
Get type-name & ID from global ID (This reverts the opaque transform)
81 82 83 84 |
# File 'lib/graphql/relay/global_node_identification.rb', line 81 def from_global_id(global_id) ensure_defined @from_global_id_proc.call(global_id) end |
#from_global_id=(proc) ⇒ Object
86 87 88 89 |
# File 'lib/graphql/relay/global_node_identification.rb', line 86 def from_global_id=(proc) ensure_defined @from_global_id_proc = proc end |
#interface ⇒ Object
Returns ‘NodeInterface`, which all Relay types must implement
27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/graphql/relay/global_node_identification.rb', line 27 def interface @interface ||= begin ensure_defined ident = self GraphQL::InterfaceType.define do name "Node" field :id, !types.ID resolve_type -> (obj, schema) { 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
113 114 115 116 |
# File 'lib/graphql/relay/global_node_identification.rb', line 113 def object_from_id(id, ctx) ensure_defined @object_from_id_proc.call(id, ctx) end |
#object_from_id=(proc) ⇒ Object
118 119 120 121 |
# File 'lib/graphql/relay/global_node_identification.rb', line 118 def object_from_id=(proc) ensure_defined @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)
69 70 71 72 |
# File 'lib/graphql/relay/global_node_identification.rb', line 69 def to_global_id(type_name, id) ensure_defined @to_global_id_proc.call(type_name, id) end |
#to_global_id=(proc) ⇒ Object
74 75 76 77 |
# File 'lib/graphql/relay/global_node_identification.rb', line 74 def to_global_id=(proc) ensure_defined @to_global_id_proc = proc end |
#type_from_object(object) ⇒ Object
Use the provided config to get a type for a given object
93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/graphql/relay/global_node_identification.rb', line 93 def type_from_object(object) ensure_defined type_result = @type_from_object_proc.call(object) if type_result.nil? nil elsif !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 109 |
# File 'lib/graphql/relay/global_node_identification.rb', line 106 def type_from_object=(proc) ensure_defined @type_from_object_proc = proc end |