From 58fc8b5557d0b75b007494c90dd1bdde4dd9fdc7 Mon Sep 17 00:00:00 2001
From: dtluna <dtluna@openmailbox.org>
Date: Tue, 20 Jun 2017 16:09:06 +0300
Subject: [PATCH] Render errors using ErrorView

---
 .../web/twitter_api/twitter_api_controller.ex | 41 ++++++++-----------
 .../web/twitter_api/views/error_view.ex       |  7 ++++
 .../web/twitter_api/views/error_view_test.exs | 14 +++++++
 3 files changed, 37 insertions(+), 25 deletions(-)
 create mode 100644 lib/pleroma/web/twitter_api/views/error_view.ex
 create mode 100644 test/web/twitter_api/views/error_view_test.exs

diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex
index 43389920..ed16e6dd 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 00000000..22bc632d
--- /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 00000000..4ed3737b
--- /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
-- 
GitLab