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