Class: GraphQL::Schema::Object

Inherits:
Member
  • Object
show all
Extended by:
Member::AcceptsDefinition, Member::CachedGraphQLDefinition::DeprecatedToGraphQL, Member::HasFields, Member::HasInterfaces
Defined in:
lib/graphql/schema/object.rb

Constant Summary

Constants included from Member::HasFields

Member::HasFields::CONFLICT_FIELD_NAMES, Member::HasFields::GRAPHQL_RUBY_KEYWORDS, Member::HasFields::RUBY_KEYWORDS

Constants included from Member::HasDirectives

Member::HasDirectives::NO_DIRECTIVES

Constants included from Member::GraphQLTypeNames

Member::GraphQLTypeNames::Boolean, Member::GraphQLTypeNames::ID, Member::GraphQLTypeNames::Int

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Member::HasFields

add_field, all_field_definitions, field, field_class, fields, get_field, global_id_field, own_fields

Methods included from Member::HasInterfaces

implements, interface_type_memberships, interfaces, own_interface_type_memberships

Methods included from Member::CachedGraphQLDefinition::DeprecatedToGraphQL

to_graphql

Methods included from Member::CachedGraphQLDefinition

#deprecated_to_graphql, #graphql_definition, #initialize_copy, #type_class

Methods included from Relay::TypeExtensions

#connection_type, #define_connection, #define_edge, #edge_type

Methods included from Member::BaseDSLMethods

#accessible?, #authorized?, #default_graphql_name, #description, #graphql_name, #introspection, #introspection?, #mutation, #name, #overridden_graphql_name, #to_graphql, #visible?

Methods included from Member::BaseDSLMethods::ConfigurationExtension

#inherited

Methods included from Member::TypeSystemHelpers

#kind, #list?, #non_null?, #to_list_type, #to_non_null_type, #to_type_signature

Methods included from Member::Scoped

#scope_items

Methods included from Member::RelayShortcuts

#connection_type, #connection_type_class, #edge_type, #edge_type_class

Methods included from Member::HasPath

#path

Methods included from Member::HasAstNode

#ast_node

Methods included from Member::HasDirectives

#directive, #directives, #remove_directive

Constructor Details

#initialize(object, context) ⇒ Object

Returns a new instance of Object.


94
95
96
97
# File 'lib/graphql/schema/object.rb', line 94

def initialize(object, context)
  @object = object
  @context = context
end

Instance Attribute Details

#contextGraphQL::Query::Context (readonly)

Returns the context instance for this query.

Returns:


16
17
18
# File 'lib/graphql/schema/object.rb', line 16

def context
  @context
end

#objectObject (readonly)

Returns the application object this type is wrapping.

Returns:

  • (Object)

    the application object this type is wrapping


13
14
15
# File 'lib/graphql/schema/object.rb', line 13

def object
  @object
end

Class Method Details

.authorized_new(object, context) ⇒ GraphQL::Schema::Object, GraphQL::Execution::Lazy

Make a new instance of this type if the auth check passes, otherwise, raise an error.

Probably only the framework should call this method.

This might return a Execution::Lazy if the user-provided .authorized? hook returns some lazy value (like a Promise).

The reason that the auth check is in this wrapper method instead of new is because of how it might return a Promise. It would be weird if .new returned a promise; It would be a headache to try to maintain Promise-y state inside a GraphQL::Schema::Object instance. So, hopefully this wrapper method will do the job.

Parameters:

Returns:

Raises:


51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/graphql/schema/object.rb', line 51

def authorized_new(object, context)
  trace_payload = { context: context, type: self, object: object, path: context[:current_path] }

  maybe_lazy_auth_val = context.query.trace("authorized", trace_payload) do
    context.query.with_error_handling do
      begin
        authorized?(object, context)
      rescue GraphQL::UnauthorizedError => err
        context.schema.unauthorized_object(err)
      end
    end
  end

  auth_val = if context.schema.lazy?(maybe_lazy_auth_val)
    GraphQL::Execution::Lazy.new do
      context.query.trace("authorized_lazy", trace_payload) do
        context.schema.sync_lazy(maybe_lazy_auth_val)
      end
    end
  else
    maybe_lazy_auth_val
  end

  context.schema.after_lazy(auth_val) do |is_authorized|
    if is_authorized
      self.new(object, context)
    else
      # It failed the authorization check, so go to the schema's authorized object hook
      err = GraphQL::UnauthorizedError.new(object: object, type: self, context: context)
      # If a new value was returned, wrap that instead of the original value
      begin
        new_obj = context.schema.unauthorized_object(err)
        if new_obj
          self.new(new_obj, context)
        else
          nil
        end
      end
    end
  end
end

.fields(context = GraphQL::Query::NullContext) ⇒ Hash<String => GraphQL::Schema::Field>

Returns All of this object's fields, indexed by name.


109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/graphql/schema/object.rb', line 109

def fields(context = GraphQL::Query::NullContext)
  all_fields = super
  # This adds fields from legacy-style interfaces only.
  # Multi-fields are not supported here.
  interfaces.each do |int|
    if int.is_a?(GraphQL::InterfaceType)
      int_f = {}
      int.fields.each do |name, legacy_field| # rubocop:disable Development/ContextIsPassedCop -- legacy-related
        int_f[name] = field_class.from_options(name, field: legacy_field)
      end
      all_fields = int_f.merge(all_fields)
    end
  end
  all_fields
end

.inherited(child_class) ⇒ Object

Set up a type-specific invalid null error to use when this object's non-null fields wrongly return nil. It should help with debugging and bug tracker integrations.


102
103
104
105
# File 'lib/graphql/schema/object.rb', line 102

def inherited(child_class)
  child_class.const_set(:InvalidNullError, GraphQL::InvalidNullError.subclass_for(child_class))
  super
end

.kindObject


146
147
148
# File 'lib/graphql/schema/object.rb', line 146

def kind
  GraphQL::TypeKinds::OBJECT
end

.to_graphqlGraphQL::ObjectType

Returns:


128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/graphql/schema/object.rb', line 128

def to_graphql
  obj_type = GraphQL::ObjectType.new
  obj_type.name = graphql_name
  obj_type.description = description
  obj_type.structural_interface_type_memberships = interface_type_memberships
  obj_type.introspection = introspection
  obj_type.mutation = mutation
  obj_type.ast_node = ast_node
  fields.each do |field_name, field_inst| # rubocop:disable Development/ContextIsPassedCop -- legacy-related
    field_defn = field_inst.to_graphql(silence_deprecation_warning: true)
    obj_type.fields[field_defn.name] = field_defn # rubocop:disable Development/ContextIsPassedCop -- legacy-related
  end

  obj_type.[:type_class] = self

  obj_type
end

Instance Method Details

#dataloaderGraphQL::Dataloader

Returns:


19
20
21
# File 'lib/graphql/schema/object.rb', line 19

def dataloader
  context.dataloader
end

#raw_value(obj) ⇒ Object

Call this in a field method to return a value that should be returned to the client without any further handling by GraphQL.


25
26
27
# File 'lib/graphql/schema/object.rb', line 25

def raw_value(obj)
  GraphQL::Execution::Interpreter::RawValue.new(obj)
end