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')
-rw-r--r--lib/gitlab/graphql/expose_permissions.rb8
-rw-r--r--lib/gitlab/graphql/extensions/forward_only_externally_paginated_array_extension.rb19
-rw-r--r--lib/gitlab/graphql/limit/field_call_count.rb13
-rw-r--r--lib/gitlab/graphql/pagination/keyset/connection.rb21
4 files changed, 39 insertions, 22 deletions
diff --git a/lib/gitlab/graphql/expose_permissions.rb b/lib/gitlab/graphql/expose_permissions.rb
index ab9ed354673..070d3c188a4 100644
--- a/lib/gitlab/graphql/expose_permissions.rb
+++ b/lib/gitlab/graphql/expose_permissions.rb
@@ -5,11 +5,15 @@ module Gitlab
module ExposePermissions
extend ActiveSupport::Concern
prepended do
- def self.expose_permissions(permission_type, description: 'Permissions for the current user on the resource')
+ def self.expose_permissions(
+ permission_type,
+ description: 'Permissions for the current user on the resource',
+ &block)
field :user_permissions, permission_type,
description: description,
null: false,
- method: :itself
+ method: :itself,
+ &block
end
end
end
diff --git a/lib/gitlab/graphql/extensions/forward_only_externally_paginated_array_extension.rb b/lib/gitlab/graphql/extensions/forward_only_externally_paginated_array_extension.rb
new file mode 100644
index 00000000000..651b4266756
--- /dev/null
+++ b/lib/gitlab/graphql/extensions/forward_only_externally_paginated_array_extension.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+module Gitlab
+ module Graphql
+ module Extensions
+ # This extension is meant for resolvers that only support forward looking pagination. So in order to limit
+ # confusion for allowed GraphQL pagination arguments on the field, we limit this to just `first` and `after`.
+ class ForwardOnlyExternallyPaginatedArrayExtension < ExternallyPaginatedArrayExtension
+ def apply
+ field.argument :after, GraphQL::Types::String,
+ description: "Returns the elements in the list that come after the specified cursor.",
+ required: false
+ field.argument :first, GraphQL::Types::Int,
+ description: "Returns the first _n_ elements from the list.",
+ required: false
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphql/limit/field_call_count.rb b/lib/gitlab/graphql/limit/field_call_count.rb
index 4165970a2a6..3a02e8abbb5 100644
--- a/lib/gitlab/graphql/limit/field_call_count.rb
+++ b/lib/gitlab/graphql/limit/field_call_count.rb
@@ -14,9 +14,18 @@ module Gitlab
private
def increment_call_count(context)
+ query_id = fetch_query_id(context)
+
context[:call_count] ||= {}
- context[:call_count][field] ||= 0
- context[:call_count][field] += 1
+ context[:call_count][query_id] ||= {}
+ context[:call_count][query_id][field] ||= 0
+ context[:call_count][query_id][field] += 1
+ end
+
+ def fetch_query_id(context)
+ context.query.operation_fingerprint
+ rescue TypeError
+ ''
end
def limit
diff --git a/lib/gitlab/graphql/pagination/keyset/connection.rb b/lib/gitlab/graphql/pagination/keyset/connection.rb
index eca4d42fb9a..208ca5f2d24 100644
--- a/lib/gitlab/graphql/pagination/keyset/connection.rb
+++ b/lib/gitlab/graphql/pagination/keyset/connection.rb
@@ -59,16 +59,7 @@ module Gitlab
if before
true
elsif first
- if Feature.enabled?(:graphql_keyset_pagination_without_next_page_query)
- limited_nodes.size > limit_value
- else
- case sliced_nodes
- when Array
- sliced_nodes.size > limit_value
- else
- sliced_nodes.limit(1).offset(limit_value).exists? # rubocop: disable CodeReuse/ActiveRecord
- end
- end
+ limited_nodes.size > limit_value
else
false
end
@@ -126,15 +117,9 @@ module Gitlab
@has_previous_page = paginated_nodes.count > limit_value
@has_previous_page ? paginated_nodes.last(limit_value) : paginated_nodes
elsif loaded?(sliced_nodes)
- if Feature.enabled?(:graphql_keyset_pagination_without_next_page_query)
- sliced_nodes.take(limit_value + 1) # rubocop: disable CodeReuse/ActiveRecord
- else
- sliced_nodes.take(limit_value) # rubocop: disable CodeReuse/ActiveRecord
- end
- elsif Feature.enabled?(:graphql_keyset_pagination_without_next_page_query)
- sliced_nodes.limit(limit_value + 1).to_a
+ sliced_nodes.take(limit_value + 1) # rubocop: disable CodeReuse/ActiveRecord
else
- sliced_nodes.limit(limit_value)
+ sliced_nodes.limit(limit_value + 1).to_a
end
end
end