summaryrefslogtreecommitdiff
path: root/lib/api
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-01-10 15:07:47 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-01-10 15:07:47 +0000
commit8b1228b0d409d7751f01d9fb72ebfbbf62399486 (patch)
tree1b4126fe48d7666a90c0d7ee26230cf8379b6410 /lib/api
parent96b0c1245c93585a8b0fe23e22306d32ff4e4905 (diff)
downloadgitlab-ce-8b1228b0d409d7751f01d9fb72ebfbbf62399486.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/api')
-rw-r--r--lib/api/helpers.rb1
-rw-r--r--lib/api/helpers/pagination.rb25
-rw-r--r--lib/api/helpers/pagination_strategies.rb33
-rw-r--r--lib/api/projects.rb24
4 files changed, 48 insertions, 35 deletions
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index bb61b4948b9..1fe2988ec1c 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -4,6 +4,7 @@ module API
module Helpers
include Gitlab::Utils
include Helpers::Pagination
+ include Helpers::PaginationStrategies
SUDO_HEADER = "HTTP_SUDO"
GITLAB_SHARED_SECRET_HEADER = "Gitlab-Shared-Secret"
diff --git a/lib/api/helpers/pagination.rb b/lib/api/helpers/pagination.rb
index 1b63e450a12..a6ae9a87f98 100644
--- a/lib/api/helpers/pagination.rb
+++ b/lib/api/helpers/pagination.rb
@@ -3,34 +3,9 @@
module API
module Helpers
module Pagination
- # This returns an ActiveRecord relation
def paginate(relation)
Gitlab::Pagination::OffsetPagination.new(self).paginate(relation)
end
-
- # This applies pagination and executes the query
- # It always returns an array instead of an ActiveRecord relation
- def paginate_and_retrieve!(relation)
- offset_or_keyset_pagination(relation).to_a
- end
-
- private
-
- def offset_or_keyset_pagination(relation)
- return paginate(relation) unless keyset_pagination_enabled?
-
- request_context = Gitlab::Pagination::Keyset::RequestContext.new(self)
-
- unless Gitlab::Pagination::Keyset.available?(request_context, relation)
- return error!('Keyset pagination is not yet available for this type of request', 405)
- end
-
- Gitlab::Pagination::Keyset.paginate(request_context, relation)
- end
-
- def keyset_pagination_enabled?
- params[:pagination] == 'keyset' && Feature.enabled?(:api_keyset_pagination, default_enabled: true)
- end
end
end
end
diff --git a/lib/api/helpers/pagination_strategies.rb b/lib/api/helpers/pagination_strategies.rb
new file mode 100644
index 00000000000..5f63635297a
--- /dev/null
+++ b/lib/api/helpers/pagination_strategies.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module API
+ module Helpers
+ module PaginationStrategies
+ def paginate_with_strategies(relation)
+ paginator = paginator(relation)
+
+ yield(paginator.paginate(relation)).tap do |records, _|
+ paginator.finalize(records)
+ end
+ end
+
+ def paginator(relation)
+ return Gitlab::Pagination::OffsetPagination.new(self) unless keyset_pagination_enabled?
+
+ request_context = Gitlab::Pagination::Keyset::RequestContext.new(self)
+
+ unless Gitlab::Pagination::Keyset.available?(request_context, relation)
+ return error!('Keyset pagination is not yet available for this type of request', 405)
+ end
+
+ Gitlab::Pagination::Keyset::Pager.new(request_context)
+ end
+
+ private
+
+ def keyset_pagination_enabled?
+ params[:pagination] == 'keyset' && Feature.enabled?(:api_keyset_pagination, default_enabled: true)
+ end
+ end
+ end
+end
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 68f199cc160..3e61b3c7f3b 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -90,18 +90,22 @@ module API
def present_projects(projects, options = {})
projects = reorder_projects(projects)
projects = apply_filters(projects)
- projects = paginate(projects)
- projects, options = with_custom_attributes(projects, options)
- options = options.reverse_merge(
- with: current_user ? Entities::ProjectWithAccess : Entities::BasicProjectDetails,
- statistics: params[:statistics],
- current_user: current_user,
- license: false
- )
- options[:with] = Entities::BasicProjectDetails if params[:simple]
+ records, options = paginate_with_strategies(projects) do |projects|
+ projects, options = with_custom_attributes(projects, options)
+
+ options = options.reverse_merge(
+ with: current_user ? Entities::ProjectWithAccess : Entities::BasicProjectDetails,
+ statistics: params[:statistics],
+ current_user: current_user,
+ license: false
+ )
+ options[:with] = Entities::BasicProjectDetails if params[:simple]
+
+ [options[:with].prepare_relation(projects, options), options]
+ end
- present options[:with].prepare_relation(projects, options), options
+ present records, options
end
def translate_params_for_compatibility(params)