defmodule SyntropyWeb.Api.HistoryController do use SyntropyWeb, :controller alias Syntropy.Persistence alias SyntropyWeb.Api.{ControllerHelpers, HistoryJSON, Listing} @memory_scan_limit 1_000 @spec index(Plug.Conn.t(), map()) :: Plug.Conn.t() def index(conn, params) do case Listing.parse_opts(params, [:kind, :q]) do {:ok, opts} -> page = snapshots_page(opts) json(conn, %{ data: Enum.map(page.entries, &HistoryJSON.snapshot/1), meta: Listing.meta(page) }) {:error, :invalid_cursor} -> ControllerHelpers.invalid_request(conn, "Invalid cursor.", []) end end @spec show(Plug.Conn.t(), map()) :: Plug.Conn.t() def show(conn, %{"id" => snapshot_id}) do case Syntropy.snapshot(snapshot_id) || Persistence.get_snapshot(snapshot_id) do nil -> ControllerHelpers.not_found(conn, "Snapshot", snapshot_id) snapshot -> json(conn, %{data: HistoryJSON.snapshot(snapshot)}) end end defp snapshots_page(opts) do if Persistence.enabled?() do Persistence.list_snapshots(opts) else @memory_scan_limit |> Syntropy.recent_snapshots() |> Listing.filter_snapshots(opts) |> Listing.paginate(opts, :inserted_at) end end end