/scrivener_headers

Scrivener pagination with headers and web linking

Primary LanguageElixirMIT LicenseMIT

Scrivener.Headers

Build Status Hex Version Hex docs License

Helpers for paginating API responses with Scrivener and HTTP headers. Implements RFC-5988, the proposed standard for Web linking.

Setup

Add to mix.exs:

  defp deps do
    [
      # ...
      {:scrivener_headers, "~> 3.1"}
      # ...
    ]
  end

Usage

With paginate/2 we can easily set our pagination headers:

def index(conn, params) do
  page = MyApp.Person
         |> where([p], p.age > 30)
         |> order_by([p], desc: p.age)
         |> preload(:friends)
         |> MyApp.Repo.paginate(params)

  conn
  |> Scrivener.Headers.paginate(page)
  |> render("index.json", people: page.entries)
end

With curl --include we can see our new headers:

$ curl --include 'https://localhost:4000/people?page=5'
HTTP/1.1 200 OK
Link: <http://localhost:4000/people?page=1>; rel="first",
  <http://localhost:4000/people?page=30>; rel="last",
  <http://localhost:4000/people?page=6>; rel="next",
  <http://localhost:4000/people?page=4>; rel="prev"
Total: 300
Per-Page: 10

Contributing

Contributions of all types are welcomed and encouraged. Please make appropriate use of Issues and Pull Requests. All code should have test coverage.

License

MIT license. Please see LICENSE for details.