defmodule PlausibleWeb.ErrorView do use Plausible use PlausibleWeb, :view def render("500.json", %{conn: %{assigns: %{plugins_api: true}}}) do contact_support_note = on_ee do "If the problem persists please contact support@plausible.io" end %{ errors: [ %{detail: "Internal server error, please try again. #{contact_support_note}"} ] } end def render("500.json", _assigns) do %{ status: 500, message: "Server error" } end def render("404.html", assigns) do assigns = assigns |> Map.put(:status, 404) |> Map.put_new(:message, "Oops! There's nothing here") render("404_error.html", assigns) end def render(<<"5", _error_5xx::binary-size(2), ".html">>, assigns) do current_user = assigns[:current_user] last_event = Sentry.get_last_event_id_and_source() case {current_user, last_event} do {current_user, {event_id, :plug}} when is_binary(event_id) and not is_nil(current_user) -> opts = %{ trace_id: event_id, user_name: current_user.name, user_email: current_user.email } render("server_error.html", Map.merge(opts, assigns)) _ -> render("server_error.html", assigns) end end def template_not_found(template, assigns) do if String.ends_with?(template, ".json") do fallback_json_error(template, assigns) else fallback_html_error(template, assigns) end end defp fallback_html_error(template, assigns) do assigns = assigns |> Map.put_new(:message, Phoenix.Controller.status_message_from_template(template)) |> Map.put(:status, String.trim_trailing(template, ".html")) render("generic_error.html", assigns) end defp fallback_json_error(template, _assigns) do status = String.split(template, ".") |> hd() |> String.to_integer() message = Plug.Conn.Status.reason_phrase(status) %{status: status, message: message} rescue _ -> %{status: 500, message: "Server error"} end defp url_path(%Plug.Conn{request_path: path, query_string: ""}), do: path defp url_path(%Plug.Conn{request_path: path, query_string: query}), do: path <> "?" <> query end