Class: GraphQL::Schema::Object

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

Defined Under Namespace

Classes: FieldsAreRequiredError

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::GraphQLTypeNames

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

Instance Attribute Summary collapse

Attributes included from Member::BaseDSLMethods

#default_graphql_name, #graphql_name

Attributes included from Member::RelayShortcuts

#connection_type, #connection_type_class, #edge_type, #edge_type_class

Attributes included from Member::HasAstNode

#ast_node

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Member::HasFields

add_field, all_field_definitions, field, field_class, global_id_field, has_no_fields, has_no_fields?, own_fields

Methods included from Member::HasInterfaces

implements, interface_type_memberships, interfaces, own_interface_type_memberships

Methods included from Member::BaseDSLMethods

#authorized?, #comment, #default_relay, #description, #introspection, #introspection?, #mutation, #name, #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

#inherited, #reauthorize_scoped_objects, #scope_items

Methods included from Member::HasPath

#path

Methods included from Member::HasAstNode

#inherited

Methods included from Member::HasDirectives

add_directive, #directive, #directives, get_directives, #inherited, #remove_directive, remove_directive

Constructor Details

#initialize(object, context) ⇒ Object

Returns a new instance of Object.



112
113
114
115
# File 'lib/graphql/schema/object.rb', line 112

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

Instance Attribute Details

#contextGraphQL::Query::Context (readonly)

Returns the context instance for this query.

Returns:



23
24
25
# File 'lib/graphql/schema/object.rb', line 23

def context
  @context
end

#objectObject (readonly)

Returns the application object this type is wrapping.

Returns:

  • (Object)

    the application object this type is wrapping



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

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:



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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/graphql/schema/object.rb', line 67

def authorized_new(object, context)
  maybe_lazy_auth_val = context.query.current_trace.authorized(query: context.query, type: self, object: object) do
    begin
      authorized?(object, context)
    rescue GraphQL::UnauthorizedError => err
      context.schema.unauthorized_object(err)
    rescue StandardError => err
      context.query.handle_or_reraise(err)
    end
  end

  auth_val = if context.schema.lazy?(maybe_lazy_auth_val)
    GraphQL::Execution::Lazy.new do
      context.query.current_trace.authorized_lazy(query: context.query, type: self, object: object) do
        context.schema.sync_lazy(maybe_lazy_auth_val)
      end
    end
  else
    maybe_lazy_auth_val
  end

  context.query.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

.const_missing(name) ⇒ 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.



120
121
122
123
124
125
126
127
128
# File 'lib/graphql/schema/object.rb', line 120

def const_missing(name)
  if name == :InvalidNullError
    custom_err_class = GraphQL::InvalidNullError.subclass_for(self)
    const_set(:InvalidNullError, custom_err_class)
    custom_err_class
  else
    super
  end
end

.kindObject



130
131
132
# File 'lib/graphql/schema/object.rb', line 130

def kind
  GraphQL::TypeKinds::OBJECT
end

.scoped_new(object, context) ⇒ Object



107
108
109
# File 'lib/graphql/schema/object.rb', line 107

def scoped_new(object, context)
  self.new(object, context)
end

.wrap(object, context) ⇒ Object

This is called by the runtime to return an object to call methods on.



46
47
48
# File 'lib/graphql/schema/object.rb', line 46

def wrap(object, context)
  authorized_new(object, context)
end

.wrap_scoped(object, context) ⇒ Object



41
42
43
# File 'lib/graphql/schema/object.rb', line 41

def wrap_scoped(object, context)
  scoped_new(object, context)
end

Instance Method Details

#dataloaderGraphQL::Dataloader

Returns:



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

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.



32
33
34
# File 'lib/graphql/schema/object.rb', line 32

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