diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index 433899207..ed16e6dd7 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -1,6 +1,6 @@ defmodule Pleroma.Web.TwitterAPI.Controller do use Pleroma.Web, :controller - alias Pleroma.Web.TwitterAPI.{StatusView, TwitterAPI, UserView} + alias Pleroma.Web.TwitterAPI.{ErrorView, StatusView, TwitterAPI, UserView} alias Pleroma.{Web, Repo, Activity} alias Pleroma.Web.ActivityPub.ActivityPub alias Ecto.Changeset @@ -74,7 +74,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do case TwitterAPI.follow(user, params) do {:ok, user, followed, _activity} -> render(conn, UserView, "show.json", %{user: followed, for: user}) - {:error, msg} -> forbidden_json_reply(conn, msg) + {:error, msg} -> forbidden_reply(conn, msg) end end @@ -82,7 +82,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do case TwitterAPI.unfollow(user, params) do {:ok, user, unfollowed} -> render(conn, UserView, "show.json", %{user: unfollowed, for: user}) - {:error, msg} -> forbidden_json_reply(conn, msg) + {:error, msg} -> forbidden_reply(conn, msg) end end @@ -115,9 +115,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do end def upload_json(conn, %{"media" => media}) do - response = TwitterAPI.upload(media, "json") - conn - |> json_reply(200, response) + json(conn, TwitterAPI.upload(media, "json")) end def config(conn, _params) do @@ -157,8 +155,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do render(conn, UserView, "show.json", %{user: user}) else {:error, errors} -> - conn - |> json_reply(400, Poison.encode!(errors)) + bad_request_reply(conn, Poison.encode!(errors)) end end @@ -171,30 +168,24 @@ defmodule Pleroma.Web.TwitterAPI.Controller do end def external_profile(%{assigns: %{user: current_user}} = conn, %{"profileurl" => uri}) do - with {:ok, user_map} <- TwitterAPI.get_external_profile(current_user, uri), - response <- Poison.encode!(user_map) do - conn - |> json_reply(200, response) + with {:ok, user_map} <- TwitterAPI.get_external_profile(current_user, uri) do + json(conn, user_map) end end - defp bad_request_reply(conn, error_message) do - json = error_json(conn, error_message) - json_reply(conn, 400, json) - end - - defp json_reply(conn, status, json) do + defp bad_request_reply(conn, message) do conn - |> put_resp_content_type("application/json") - |> send_resp(status, json) + |> put_status(:bad_request) + |> render_error(message) end - defp forbidden_json_reply(conn, error_message) do - json = error_json(conn, error_message) - json_reply(conn, 403, json) + defp forbidden_reply(conn, message) do + conn + |> put_status(:forbidden) + |> render_error(message) end - defp error_json(conn, error_message) do - %{"error" => error_message, "request" => conn.request_path} |> Poison.encode! + defp render_error(conn, message) do + render(conn, ErrorView, "error.json", %{request_path: conn.request_path, message: message}) end end diff --git a/lib/pleroma/web/twitter_api/views/error_view.ex b/lib/pleroma/web/twitter_api/views/error_view.ex new file mode 100644 index 000000000..22bc632d9 --- /dev/null +++ b/lib/pleroma/web/twitter_api/views/error_view.ex @@ -0,0 +1,7 @@ +defmodule Pleroma.Web.TwitterAPI.ErrorView do + use Pleroma.Web, :view + + def render("error.json", %{request_path: request_path, message: message}) do + %{error: message, request: request_path} + end +end diff --git a/test/web/twitter_api/views/error_view_test.exs b/test/web/twitter_api/views/error_view_test.exs new file mode 100644 index 000000000..4ed3737b2 --- /dev/null +++ b/test/web/twitter_api/views/error_view_test.exs @@ -0,0 +1,14 @@ +defmodule Pleroma.Web.TwitterAPI.ErrorViewTest do + use Pleroma.DataCase + + alias Pleroma.Web.TwitterAPI.ErrorView + + test "render an error" do + path = "/labor_theory_of_value" + message = "Labor theory of value is invalid!" + map = %{request_path: path, message: message} + expected_object = %{request: path, error: message} + + assert expected_object == ErrorView.render("error.json", map) + end +end