Some checks failed
Build and Publish / build-release (push) Failing after 23s
61 lines
1.5 KiB
Elixir
61 lines
1.5 KiB
Elixir
defmodule CustomerServiceWeb.ErrorJSON do
|
|
@moduledoc """
|
|
This module is invoked by your endpoint in case of errors on JSON requests.
|
|
"""
|
|
|
|
alias Ecto.Changeset
|
|
alias OpenApiSpex.Error
|
|
|
|
def render("404.json", _assigns) do
|
|
%{errors: %{detail: "Not Found"}}
|
|
end
|
|
|
|
def render("500.json", assigns) do
|
|
detail = detailed_message(assigns[:reason], "Internal Server Error")
|
|
%{errors: %{detail: detail}}
|
|
end
|
|
|
|
def render("400.json", assigns) do
|
|
detail = detailed_message(assigns[:reason], "Bad Request")
|
|
%{errors: %{detail: detail}}
|
|
end
|
|
|
|
def render("422.json", assigns) do
|
|
detail = detailed_message(assigns[:reason], "Unprocessable Entity")
|
|
%{errors: %{detail: detail}}
|
|
end
|
|
|
|
def render(template, assigns) do
|
|
detail =
|
|
detailed_message(
|
|
assigns[:reason],
|
|
Phoenix.Controller.status_message_from_template(template)
|
|
)
|
|
|
|
%{errors: %{detail: detail}}
|
|
end
|
|
|
|
defp detailed_message(nil, default), do: default
|
|
|
|
defp detailed_message(%Changeset{} = changeset, _default) do
|
|
format_changeset_errors(changeset)
|
|
|> inspect()
|
|
end
|
|
|
|
defp detailed_message(%Error{errors: errors}, _default) do
|
|
Enum.map_join(errors, ", ", fn e -> "#{e.code}: #{e.message}" end)
|
|
end
|
|
|
|
defp detailed_message(reason, _default) do
|
|
inspect(reason, pretty: true)
|
|
end
|
|
|
|
defp format_changeset_errors(changeset) do
|
|
Changeset.traverse_errors(changeset, fn {msg, opts} ->
|
|
Enum.reduce(opts, msg, fn {key, value}, acc ->
|
|
String.replace(acc, "%{#{key}}", to_string(value))
|
|
end)
|
|
end)
|
|
end
|
|
end
|