api-v2/lib/api/pagination.ex
2025-04-16 10:03:13 -03:00

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