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:
-rw-r--r--lib/api/helpers.rb20
-rw-r--r--spec/requests/api/issues_spec.rb6
2 files changed, 24 insertions, 2 deletions
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index fc309f65a56..03a2968fcc7 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -56,8 +56,12 @@ module API
end
end
- def paginate(object)
- object.page(params[:page]).per(params[:per_page].to_i)
+ def paginate(relation)
+ per_page = params[:per_page].to_i
+ paginated = relation.page(params[:page]).per(per_page)
+ add_pagination_headers(paginated, per_page)
+
+ paginated
end
def authenticate!
@@ -134,6 +138,18 @@ module API
private
+ def add_pagination_headers(paginated, per_page)
+ request_url = request.url.split('?').first
+
+ links = []
+ links << %(<#{request_url}?page=#{paginated.current_page - 1}&per_page=#{per_page}>; rel="prev") unless paginated.first_page?
+ links << %(<#{request_url}?page=#{paginated.current_page + 1}&per_page=#{per_page}>; rel="next") unless paginated.last_page?
+ links << %(<#{request_url}?page=1&per_page=#{per_page}>; rel="first")
+ links << %(<#{request_url}?page=#{paginated.total_pages}&per_page=#{per_page}>; rel="last")
+
+ header 'Link', links.join(', ')
+ end
+
def abilities
@abilities ||= begin
abilities = Six.new
diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb
index e9422cd2643..0b4f22bfb3d 100644
--- a/spec/requests/api/issues_spec.rb
+++ b/spec/requests/api/issues_spec.rb
@@ -25,6 +25,12 @@ describe API::API do
json_response.should be_an Array
json_response.first['title'].should == issue.title
end
+
+ it "should add pagination headers" do
+ get api("/issues?per_page=3", user)
+ response.headers['Link'].should ==
+ '<http://www.example.com/api/v3/issues?page=1&per_page=3>; rel="first", <http://www.example.com/api/v3/issues?page=1&per_page=3>; rel="last"'
+ end
end
end