File size: 1,404 Bytes
88211d3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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
|