analytics/lib/plausible_web/plugins/api/errors.ex

54 lines
1.4 KiB
Elixir

defmodule PlausibleWeb.Plugins.API.Errors do
@moduledoc """
Common responses for Plugins API
"""
import Plug.Conn
import Plausible.ChangesetHelpers
@spec unauthorized(Plug.Conn.t()) :: Plug.Conn.t()
def unauthorized(conn) do
conn
|> put_resp_header("www-authenticate", ~s[Basic realm="Plugins API Access"])
|> error(:unauthorized, "Plugins API: unauthorized")
end
@spec error(
Plug.Conn.t(),
Plug.Conn.status(),
String.t() | [String.t()] | Ecto.Changeset.t() | [Ecto.Changeset.t()]
) ::
Plug.Conn.t()
def error(conn, status, message) when is_binary(message) do
error(conn, status, [message])
end
def error(conn, status, message) when is_map(message) do
error(conn, status, [message])
end
def error(conn, status, messages) when is_list(messages) do
response =
Jason.encode!(%{
errors:
Enum.map(messages, fn
message when is_binary(message) ->
%{detail: message}
%Ecto.Changeset{} = changeset ->
changeset
|> traverse_errors()
|> Enum.map(fn {key, message} ->
%{detail: "#{key}: #{message}"}
end)
end)
|> List.flatten()
})
conn
|> put_resp_content_type("application/json")
|> send_resp(status, response)
|> halt()
end
end