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:
authorGitLab Bot <gitlab-bot@gitlab.com>2019-11-15 15:06:12 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2019-11-15 15:06:12 +0300
commit3fc9a8e6957ddf75576dc63069c4c0249514499f (patch)
tree003e30463853843d6fb736a9396c7eb53a3dfc9a /lib/gitlab/graphql
parente24153b0cb080b1b25076f8fd358b4273848f2e2 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/graphql')
-rw-r--r--lib/gitlab/graphql/authorize/instrumentation.rb6
-rw-r--r--lib/gitlab/graphql/connections.rb4
-rw-r--r--lib/gitlab/graphql/connections/filterable_array_connection.rb17
-rw-r--r--lib/gitlab/graphql/filterable_array.rb14
4 files changed, 40 insertions, 1 deletions
diff --git a/lib/gitlab/graphql/authorize/instrumentation.rb b/lib/gitlab/graphql/authorize/instrumentation.rb
index 15ecc3b04f0..f9ff2b30eae 100644
--- a/lib/gitlab/graphql/authorize/instrumentation.rb
+++ b/lib/gitlab/graphql/authorize/instrumentation.rb
@@ -9,12 +9,16 @@ module Gitlab
def instrument(_type, field)
service = AuthorizeFieldService.new(field)
- if service.authorizations?
+ if service.authorizations? && !resolver_skips_authorizations?(field)
field.redefine { resolve(service.authorized_resolve) }
else
field
end
end
+
+ def resolver_skips_authorizations?(field)
+ field.metadata[:resolver].try(:skip_authorizations?)
+ end
end
end
end
diff --git a/lib/gitlab/graphql/connections.rb b/lib/gitlab/graphql/connections.rb
index 64f7a268b7e..38c7d98f37c 100644
--- a/lib/gitlab/graphql/connections.rb
+++ b/lib/gitlab/graphql/connections.rb
@@ -8,6 +8,10 @@ module Gitlab
ActiveRecord::Relation,
Gitlab::Graphql::Connections::Keyset::Connection
)
+ GraphQL::Relay::BaseConnection.register_connection_implementation(
+ Gitlab::Graphql::FilterableArray,
+ Gitlab::Graphql::Connections::FilterableArrayConnection
+ )
end
end
end
diff --git a/lib/gitlab/graphql/connections/filterable_array_connection.rb b/lib/gitlab/graphql/connections/filterable_array_connection.rb
new file mode 100644
index 00000000000..800f2c949c6
--- /dev/null
+++ b/lib/gitlab/graphql/connections/filterable_array_connection.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Graphql
+ module Connections
+ # FilterableArrayConnection is useful especially for lazy-loaded values.
+ # It allows us to call a callback only on the slice of array being
+ # rendered in the "after loaded" phase. For example we can check
+ # permissions only on a small subset of items.
+ class FilterableArrayConnection < GraphQL::Relay::ArrayConnection
+ def paged_nodes
+ @filtered_nodes ||= nodes.filter_callback.call(super)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphql/filterable_array.rb b/lib/gitlab/graphql/filterable_array.rb
new file mode 100644
index 00000000000..4909d291fd6
--- /dev/null
+++ b/lib/gitlab/graphql/filterable_array.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Graphql
+ class FilterableArray < Array
+ attr_reader :filter_callback
+
+ def initialize(filter_callback, *args)
+ super(args)
+ @filter_callback = filter_callback
+ end
+ end
+ end
+end