Class: GraphQL::Relay::GlobalNodeIdentification

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeGlobalNodeIdentification

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_separatorObject

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

.instanceObject

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

#fieldObject

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

#interfaceObject

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