Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/graphql/present/field_extension.rb')
-rw-r--r--lib/gitlab/graphql/present/field_extension.rb36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/gitlab/graphql/present/field_extension.rb b/lib/gitlab/graphql/present/field_extension.rb
new file mode 100644
index 00000000000..2e211b70d35
--- /dev/null
+++ b/lib/gitlab/graphql/present/field_extension.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Graphql
+ module Present
+ class FieldExtension < ::GraphQL::Schema::FieldExtension
+ SAFE_CONTEXT_KEYS = %i[current_user].freeze
+
+ def resolve(object:, arguments:, context:)
+ attrs = safe_context_values(context)
+
+ # We need to handle the object being either a Schema::Object or an
+ # inner Schema::Object#object. This depends on whether the field
+ # has a @resolver_proc or not.
+ if object.is_a?(::Types::BaseObject)
+ object.present(field.owner, attrs)
+ yield(object, arguments)
+ else
+ # This is the legacy code-path, hit if the field has a @resolver_proc
+ # TODO: remove this when resolve procs are removed from the
+ # graphql-ruby library, and all field instrumentation is removed.
+ # See: https://github.com/rmosolgo/graphql-ruby/issues/3385
+ presented = field.owner.try(:present, object, attrs) || object
+ yield(presented, arguments)
+ end
+ end
+
+ private
+
+ def safe_context_values(context)
+ context.to_h.slice(*SAFE_CONTEXT_KEYS)
+ end
+ end
+ end
+ end
+end