defmodule MateriaWeb.ErrorView do use MateriaWeb, :view alias Materia.Errors.BusinessError alias Ecto.StaleEntryError require Logger # If you want to customize a particular status code # for a certain format, you may uncomment below. # def render("500.html", _assigns) do # "Internal Server Error" # end # By default, Phoenix returns the status message from # the template name. For example, "404.html" becomes # "Not Found". def template_not_found(template, _assigns) do Phoenix.Controller.status_message_from_template(template) end def render_error(conn, %BusinessError{} = error) do message = error.message |> gettext_message() |> encode_message() Plug.Conn.send_resp(conn, :bad_request, message) end def render_error(conn, %StaleEntryError{} = error) do Logger.error("#{__MODULE__} render_error/2. error:#{inspect(error)}") # StaleEntryErrorのmessageはスキーマの全情報が含まれる。隠匿の為固定メッセージでエラー送出する message = "attempted to update a stale struct" |> gettext_message() |> encode_message() Plug.Conn.send_resp(conn, :unprocessable_entity, message) end def render_error(conn, error) do Logger.error("#{__MODULE__} render_error/2. error:#{inspect(error)}") # errorによってどのような項目が含まれているか異なる為、隠匿の為固定メッセージでエラー送出する message = "Internal Server Error" |> gettext_message() |> encode_message() Plug.Conn.send_resp(conn, :internal_server_error, message) end def gettext_message(message) when is_binary(message) do gettext = Application.get_env(:materia, :gettext) Gettext.dgettext(gettext, "errors", message) end def gettext_message(message) do message end def encode_message(message) do with {:ok, json_message} <- Poison.encode(message) do json_message else {:error, reason} -> "\"#{__MODULE__} encode_message. error message encode failed. reason:#{inspect(reason)}\"" end end end