Skip to main content

lib/queries.ex

defmodule Ocelot.Queries do
  import Ecto.Query
  alias Oban.Job

  @page_size 20

  @doc """
  Returns `{jobs, total_pages}` for the given page.

  Accepted options: `:page` (1-based, default 1).
  Results are ordered newest first (descending id), 20 per page.
  """
  def list_jobs(repo, opts \\ []) do
    page = max(Keyword.get(opts, :page, 1), 1)
    offset = (page - 1) * @page_size

    base = Job |> order_by([j], desc: j.id)

    total = repo.aggregate(base, :count)
    jobs = base |> limit(@page_size) |> offset(^offset) |> repo.all()
    total_pages = max(ceil(total / @page_size), 1)

    {jobs, total_pages}
  end

  @doc "Returns a single `Oban.Job` by id, or nil."
  def get_job(repo, id) do
    repo.get(Job, id)
  end
end