40 lines
1.1 KiB
Elixir
40 lines
1.1 KiB
Elixir
defmodule Api.Pagination do
|
|
import Ecto.Query
|
|
|
|
alias Api.Repo
|
|
|
|
def query(query, page, per_page: per_page) when is_binary(page) do
|
|
query(query, String.to_integer(page), per_page: per_page)
|
|
end
|
|
|
|
def query(query, page, per_page: per_page) do
|
|
query
|
|
|> limit(^(per_page + 1))
|
|
|> offset(^(per_page * (page - 1)))
|
|
|> Repo.all()
|
|
end
|
|
|
|
def page(query, page, per_page: per_page) when is_binary(page) do
|
|
page(query, String.to_integer(page), per_page: per_page)
|
|
end
|
|
|
|
def page(query, page, per_page: per_page) do
|
|
results = query(query, page, per_page: per_page)
|
|
has_next = length(results) > per_page
|
|
has_previous = page > 1
|
|
count = Repo.one(from(t in subquery(query), select: count("*")))
|
|
%{
|
|
has_next: has_next,
|
|
has_previous: has_previous,
|
|
prev_page: page - 1,
|
|
page: page,
|
|
next_page: page + 1,
|
|
first: (page - 1) * per_page + 1,
|
|
last: Enum.min([page * per_page, count]),
|
|
# total de registros
|
|
total_pages: round(count / per_page),
|
|
list: Enum.slice(results, 0, per_page)
|
|
}
|
|
end
|
|
end
|