defmodule SyntropyWeb.Api.TaskController do use SyntropyWeb, :controller alias Syntropy.HistoryStore alias SyntropyWeb.Api.{ControllerHelpers, TaskJSON, TaskRequest} @spec index(Plug.Conn.t(), map()) :: Plug.Conn.t() def index(conn, params) do limit = ControllerHelpers.limit(params) tasks = Syntropy.recent_tasks(limit) |> Enum.map(&serialize_task/1) json(conn, %{data: tasks}) end @spec show(Plug.Conn.t(), map()) :: Plug.Conn.t() def show(conn, %{"id" => task_id}) do case Syntropy.task(task_id) do nil -> ControllerHelpers.not_found(conn, "Task", task_id) task -> json(conn, %{data: serialize_task(task)}) end end @spec create(Plug.Conn.t(), map()) :: Plug.Conn.t() def create(conn, params) do with {:ok, %{prompt: prompt, opts: opts}} <- TaskRequest.parse(params), {:ok, task} <- Syntropy.submit(prompt, opts) do json(conn, %{data: serialize_task(task)}) else {:error, errors} when is_list(errors) -> ControllerHelpers.invalid_request(conn, "Invalid task request.", errors) {:error, reason} -> ControllerHelpers.task_failure(conn, reason) end end defp serialize_task(task) do snapshot_ids = task.task_id |> HistoryStore.for_task() |> Enum.map(& &1.id) TaskJSON.task(task, snapshot_ids) end end