Commit 046fa9bd authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge pull request #5469 from NARKOZ/api-pagination-headers

add 'Link' header for API response
parents 8769b7ab 0678b8a4
...@@ -56,8 +56,12 @@ module API ...@@ -56,8 +56,12 @@ module API
end end
end end
def paginate(object) def paginate(relation)
object.page(params[:page]).per(params[:per_page].to_i) per_page = params[:per_page].to_i
paginated = relation.page(params[:page]).per(per_page)
add_pagination_headers(paginated, per_page)
paginated
end end
def authenticate! def authenticate!
...@@ -134,6 +138,18 @@ module API ...@@ -134,6 +138,18 @@ module API
private 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 def abilities
@abilities ||= begin @abilities ||= begin
abilities = Six.new abilities = Six.new
......
...@@ -25,6 +25,12 @@ describe API::API do ...@@ -25,6 +25,12 @@ describe API::API do
json_response.should be_an Array json_response.should be_an Array
json_response.first['title'].should == issue.title json_response.first['title'].should == issue.title
end 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
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment