From cc21fc5f537510416a088adff085b675de1be58e Mon Sep 17 00:00:00 2001
From: Karen Konou <konoukaren@gmail.com>
Date: Sun, 10 Feb 2019 09:31:20 +0100
Subject: [PATCH] refactor, status view updating, error handling

---
 .../mastodon_api/mastodon_api_controller.ex   |  5 +++
 .../web/mastodon_api/views/status_view.ex     |  2 +-
 lib/pleroma/web/thread_mute.ex                | 38 ++++++++++---------
 3 files changed, 26 insertions(+), 19 deletions(-)

diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
index a93f4297b..073e0a5ea 100644
--- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
+++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
@@ -450,6 +450,11 @@ def mute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do
       conn
       |> put_view(StatusView)
       |> try_render("status.json", %{activity: activity, for: user, as: :activity})
+    else
+      {:error, reason} ->
+        conn
+        |> put_resp_content_type("application/json")
+        |> send_resp(:bad_request, Jason.encode!(%{"error" => reason}))
     end
   end
 
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index a227d742d..d6176a68a 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -160,7 +160,7 @@ def render("status.json", %{activity: %{data: %{"object" => object}} = activity}
       reblogged: present?(repeated),
       favourited: present?(favorited),
       bookmarked: present?(bookmarked),
-      muted: false,
+      muted: Pleroma.Web.ThreadMute.muted?(user, activity),
       pinned: pinned?(activity, user),
       sensitive: sensitive,
       spoiler_text: object["summary"] || "",
diff --git a/lib/pleroma/web/thread_mute.ex b/lib/pleroma/web/thread_mute.ex
index b5bff86be..695ea2512 100644
--- a/lib/pleroma/web/thread_mute.ex
+++ b/lib/pleroma/web/thread_mute.ex
@@ -20,40 +20,42 @@ def changeset(mute, params \\ %{}) do
     |> Ecto.Changeset.unique_constraint(:user_id, name: :unique_index)
   end
 
+  def query(user, context) do
+    user_id = Pleroma.FlakeId.from_string(user.id)
+
+    ThreadMute
+    |> Ecto.Query.where(user_id: ^user_id)
+    |> Ecto.Query.where(context: ^context)
+  end
+
   def add_mute(user, id) do
     activity = Activity.get_by_id(id)
-    context = activity.data["context"]
-    changeset = changeset(%Pleroma.Web.ThreadMute{}, %{user_id: user.id, context: context})
 
-    case Repo.insert(changeset) do
-      {:ok, _} -> {:ok, activity}
+    with changeset <-
+           changeset(%ThreadMute{}, %{user_id: user.id, context: activity.data["context"]}),
+         {:ok, _} <- Repo.insert(changeset) do
+      {:ok, activity}
+    else
       {:error, _} -> {:error, "conversation is already muted"}
     end
   end
 
   def remove_mute(user, id) do
-    user_id = Pleroma.FlakeId.from_string(user.id)
     activity = Activity.get_by_id(id)
-    context = activity.data["context"]
 
-    Ecto.Query.from(m in ThreadMute, where: m.user_id == ^user_id and m.context == ^context)
+    query(user, activity.data["context"])
     |> Repo.delete_all()
 
     {:ok, activity}
   end
 
+  def muted?(%{id: nil} = _user, _), do: false
+
   def muted?(user, activity) do
-    user_id = Pleroma.FlakeId.from_string(user.id)
-    context = activity.data["context"]
-
-    result =
-      Ecto.Query.from(m in ThreadMute,
-        where: m.user_id == ^user_id and m.context == ^context
-      )
-      |> Repo.all()
-
-    case result do
-      [] -> false
+    with query <- query(user, activity.data["context"]),
+         [] <- Repo.all(query) do
+      false
+    else
       _ -> true
     end
   end