| 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 |
|
|