Update the mute implementation to the current codebase
authorEkaterina Vaartis <vaartis@cock.li>
Tue, 19 Feb 2019 20:09:16 +0000 (23:09 +0300)
committerEkaterina Vaartis <vaartis@cock.li>
Tue, 19 Feb 2019 20:09:16 +0000 (23:09 +0300)
Make it part of the info thing (and do a migration to ensure it's there)

lib/pleroma/user.ex
lib/pleroma/user/info.ex
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/mastodon_api/views/account_view.ex
priv/repo/migrations/20190219192317_create_user_mutes.exs [new file with mode: 0644]

index cfb44ebaa4cb9d306bd9588bc0e983152dcb6927..35ba4ad995246a7362a8a05cb14ca6f53610d714 100644 (file)
@@ -889,21 +889,27 @@ defmodule Pleroma.User do
   end
 
   def mute(muter, %User{ap_id: ap_id}) do
-    mutes = muter.info["mutes"] || []
-    new_mutes = Enum.uniq([ap_id | mutes])
-    new_info = Map.put(muter.info, "mutes", new_mutes)
+    info_cng =
+      muter.info
+      |> User.Info.add_to_mutes(ap_id)
+
+    cng =
+      change(muter)
+      |> put_embed(:info, info_cng)
 
-    User.info_changeset(muter, %{info: new_info})
-    |> update_and_set_cache()
+    update_and_set_cache(cng)
   end
 
-  def unmute(user, %{ap_id: ap_id}) do
-    mutes = user.info["mutes"] || []
-    new_mutes = List.delete(mutes, ap_id)
-    new_info = Map.put(user.info, "mutes", new_mutes)
+  def unmute(muter, %{ap_id: ap_id}) do
+    info_cng =
+      muter.info
+      |> User.Info.remove_from_mutes(ap_id)
 
-    User.info_changeset(user, %{info: new_info})
-    |> update_and_set_cache()
+    cng =
+      change(muter)
+      |> put_embed(:info, info_cng)
+
+    update_and_set_cache(cng)
   end
 
   def block(blocker, %User{ap_id: ap_id} = blocked) do
@@ -948,7 +954,7 @@ defmodule Pleroma.User do
     update_and_set_cache(cng)
   end
 
-  def mutes?(user, %{ap_id: ap_id}), do: Enum.member?(user.info["mutes"] || [], ap_id)
+  def mutes?(user, %{ap_id: ap_id}), do: Enum.member?(user.info.mutes, ap_id)
 
   def blocks?(user, %{ap_id: ap_id}) do
     blocks = user.info.blocks
@@ -961,6 +967,9 @@ defmodule Pleroma.User do
       end)
   end
 
+  def muted_users(user),
+    do: Repo.all(from(u in User, where: u.ap_id in ^user.info.mutes))
+
   def blocked_users(user),
     do: Repo.all(from(u in User, where: u.ap_id in ^user.info.blocks))
 
index 9099d7fbba20167bb94cc37563d3e85b57b2f07d..00a0f6df3fc05868578965860ad3f5588072b400 100644 (file)
@@ -19,6 +19,7 @@ defmodule Pleroma.User.Info do
     field(:default_scope, :string, default: "public")
     field(:blocks, {:array, :string}, default: [])
     field(:domain_blocks, {:array, :string}, default: [])
+    field(:mutes, {:array, :string}, default: [])
     field(:deactivated, :boolean, default: false)
     field(:no_rich_text, :boolean, default: false)
     field(:ap_enabled, :boolean, default: false)
@@ -74,6 +75,14 @@ defmodule Pleroma.User.Info do
     |> validate_required([:follower_count])
   end
 
+  def set_mutes(info, mutes) do
+    params = %{mutes: mutes}
+
+    info
+    |> cast(params, [:mutes])
+    |> validate_required([:mutes])
+  end
+
   def set_blocks(info, blocks) do
     params = %{blocks: blocks}
 
@@ -82,6 +91,14 @@ defmodule Pleroma.User.Info do
     |> validate_required([:blocks])
   end
 
+  def add_to_mutes(info, muted) do
+    set_mutes(info, Enum.uniq([muted | info.mutes]))
+  end
+
+  def remove_from_mutes(info, muted) do
+    set_mutes(info, List.delete(info.mutes, muted))
+  end
+
   def add_to_block(info, blocked) do
     set_blocks(info, Enum.uniq([blocked | info.blocks]))
   end
index 36e5e23bff61fb6ce97eae51f855452964e1ddbe..cb8a2139e0d286ead368385b7111f393a597f352 100644 (file)
@@ -577,7 +577,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   defp restrict_reblogs(query, _), do: query
 
   defp restrict_muted(query, %{"muting_user" => %User{info: info}}) do
-    mutes = info["mutes"] || []
+    mutes = info.mutes
 
     from(
       activity in query,
index 49b49be19fc68b201fd79ed78cf167b8346db2f1..3a343f3d8d209c24fb9c5fcccfbba69efc96e6a2 100644 (file)
@@ -769,22 +769,34 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   def mute(%{assigns: %{user: muter}} = conn, %{"id" => id}) do
     with %User{} = muted <- Repo.get(User, id),
          {:ok, muter} <- User.mute(muter, muted) do
-      render(conn, AccountView, "relationship.json", %{user: muter, target: muted})
+      conn
+      |> put_view(AccountView)
+      |> render("relationship.json", %{user: muter, target: muted})
+    else
+      {:error, message} ->
+        conn
+        |> put_resp_content_type("application/json")
+        |> send_resp(403, Jason.encode!(%{"error" => message}))
     end
   end
 
   def unmute(%{assigns: %{user: muter}} = conn, %{"id" => id}) do
     with %User{} = muted <- Repo.get(User, id),
          {:ok, muter} <- User.unmute(muter, muted) do
-      render(conn, AccountView, "relationship.json", %{user: muter, target: muted})
+      conn
+      |> put_view(AccountView)
+      |> render("relationship.json", %{user: muter, target: muted})
+    else
+      {:error, message} ->
+        conn
+        |> put_resp_content_type("application/json")
+        |> send_resp(403, Jason.encode!(%{"error" => message}))
     end
   end
 
-  # TODO: Use proper query
   def mutes(%{assigns: %{user: user}} = conn, _) do
-    with muted_users <- user.info["mutes"] || [],
-         accounts <- Enum.map(muted_users, fn ap_id -> User.get_cached_by_ap_id(ap_id) end) do
-      res = AccountView.render("accounts.json", users: accounts, for: user, as: :user)
+    with muted_accounts <- User.muted_users(user) do
+      res = AccountView.render("accounts.json", users: muted_accounts, for: user, as: :user)
       json(conn, res)
     end
   end
index 91b3e034fcbcae9c02be58de4543672917a1d53f..8fdefdebd167208f522251f6fe41c1097c7b869c 100644 (file)
@@ -48,7 +48,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
       followed_by: User.following?(target, user),
       blocking: User.blocks?(user, target),
       muting: User.mutes?(user, target),
-      muting: false,
       muting_notifications: false,
       requested: requested,
       domain_blocking: false,
diff --git a/priv/repo/migrations/20190219192317_create_user_mutes.exs b/priv/repo/migrations/20190219192317_create_user_mutes.exs
new file mode 100644 (file)
index 0000000..3040745
--- /dev/null
@@ -0,0 +1,7 @@
+defmodule Pleroma.Repo.Migrations.CreateUserMutes do
+  use Ecto.Migration
+
+  def change do
+    execute "UPDATE users SET info = jsonb_set(info, '{mutes}', '[]'::jsonb);"
+  end
+end