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