Packages

A Fair Source multi-agent runtime with deterministic agent scoring and replayable run history.

Current section

Files

Jump to
syntropy lib syntropy_web controllers api history_controller.ex
Raw

lib/syntropy_web/controllers/api/history_controller.ex

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