diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-15 15:06:12 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-15 15:06:12 +0300 |
commit | 3fc9a8e6957ddf75576dc63069c4c0249514499f (patch) | |
tree | 003e30463853843d6fb736a9396c7eb53a3dfc9a /lib/gitlab/graphql | |
parent | e24153b0cb080b1b25076f8fd358b4273848f2e2 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/graphql')
-rw-r--r-- | lib/gitlab/graphql/authorize/instrumentation.rb | 6 | ||||
-rw-r--r-- | lib/gitlab/graphql/connections.rb | 4 | ||||
-rw-r--r-- | lib/gitlab/graphql/connections/filterable_array_connection.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/graphql/filterable_array.rb | 14 |
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 |