defmodule MusicLibraryWeb.ErrorController do use MusicLibraryWeb, :controller alias MusicLibrary.Errors def index(conn, params) do status = parse_status(params["status"]) muted = parse_muted(params["muted"]) search = params["search"] limit = parse_int(params["limit"], 50) offset = parse_int(params["offset"], 0) opts = [] |> maybe_put(:status, status) |> maybe_put(:muted, muted) |> Keyword.put(:search, search) |> Keyword.put(:limit, limit) |> Keyword.put(:offset, offset) %{errors: errors, total: total} = Errors.list_errors(opts) render(conn, :index, errors: errors, total: total, limit: limit, offset: offset) end def show(conn, %{"id" => id}) do {id_int, ""} = Integer.parse(id) case Errors.get_error(id_int) do {:ok, error} -> render(conn, :show, error: error) {:error, :not_found} -> conn |> put_status(:not_found) |> json(%{error: "Not Found"}) end end # -- private helpers -- defp parse_status(nil), do: nil defp parse_status("resolved"), do: :resolved defp parse_status("unresolved"), do: :unresolved defp parse_status(_), do: nil defp parse_muted(nil), do: nil defp parse_muted("true"), do: true defp parse_muted("false"), do: false defp parse_muted(_), do: nil defp parse_int(nil, default), do: default defp parse_int(value, default) when is_binary(value) do case Integer.parse(value) do {int, ""} -> int _ -> default end end defp parse_int(_, default), do: default defp maybe_put(kw, _key, nil), do: kw defp maybe_put(kw, key, value), do: Keyword.put(kw, key, value) end