diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-03-31 13:46:57 +0300 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-03-31 13:46:57 +0300 |
commit | 046fa9bdb106f4a94b3f62646726e99923e75b0a (patch) | |
tree | c55739c4e6cd82a900a83fa4b3478d111f4d129e | |
parent | 8769b7ab9774c0daa040f114e604141ad294e0e2 (diff) | |
parent | 0678b8a426553110e63dde3c75aaf719e74771e1 (diff) | |
download | gitlab-ce-046fa9bdb106f4a94b3f62646726e99923e75b0a.tar.gz |
Merge pull request #5469 from NARKOZ/api-pagination-headers
add 'Link' header for API response
-rw-r--r-- | lib/api/helpers.rb | 20 | ||||
-rw-r--r-- | spec/requests/api/issues_spec.rb | 6 |
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 |