lib/ex_teal/resource/pagination.ex

defmodule ExTeal.Resource.Pagination do
  @moduledoc """
  Used to build paginated views of resources
  """
  import Ecto.Query

  def paginate_query(query, conn, resource) do
    per_page = conn.params |> Map.get("per_page", "25") |> String.to_integer()
    page = conn.params |> Map.get("page", "1") |> String.to_integer()

    offset = (page - 1) * per_page

    data_query = from(query, limit: ^per_page, offset: ^offset)

    agg_query =
      query
      |> exclude(:preload)
      |> exclude(:select)
      |> exclude(:order_by)

    agg_query = from(q in subquery(agg_query), select: count(q.id))
    all = resource.repo().one(agg_query)

    total = Float.ceil(all / per_page)

    %{
      results: resource.repo().all(data_query),
      all: all,
      total: trunc(total)
    }
  end
end