CommonAPI: Unblock a user even if we don't have an activity.
authorlain <lain@soykaf.club>
Sat, 16 May 2020 10:28:24 +0000 (12:28 +0200)
committerlain <lain@soykaf.club>
Sat, 16 May 2020 10:28:24 +0000 (12:28 +0200)
lib/pleroma/web/common_api/common_api.ex
test/web/common_api/common_api_test.exs

index 601caeb46f130a7f0e331bd35d51ebcbf599cb69..7c94f16b61b5110139370a505a610db404847698 100644 (file)
@@ -25,10 +25,21 @@ defmodule Pleroma.Web.CommonAPI do
   require Logger
 
   def unblock(blocker, blocked) do
-    with %Activity{} = block <- Utils.fetch_latest_block(blocker, blocked),
+    with {_, %Activity{} = block} <- {:fetch_block, Utils.fetch_latest_block(blocker, blocked)},
          {:ok, unblock_data, _} <- Builder.undo(blocker, block),
          {:ok, unblock, _} <- Pipeline.common_pipeline(unblock_data, local: true) do
       {:ok, unblock}
+    else
+      {:fetch_block, nil} ->
+        if User.blocks?(blocker, blocked) do
+          User.unblock(blocker, blocked)
+          {:ok, :no_activity}
+        else
+          {:error, :not_blocking}
+        end
+
+      e ->
+        e
     end
   end
 
index 26e41c31392bcf64d116c232d51aa24a730ab147..fd829901350e17eae2840dd12ee84456403bda48 100644 (file)
@@ -23,6 +23,18 @@ defmodule Pleroma.Web.CommonAPITest do
   setup do: clear_config([:instance, :limit])
   setup do: clear_config([:instance, :max_pinned_statuses])
 
+  describe "unblocking" do
+    test "it works even without an existing block activity" do
+      blocked = insert(:user)
+      blocker = insert(:user)
+      User.block(blocker, blocked)
+
+      assert User.blocks?(blocker, blocked)
+      assert {:ok, :no_activity} == CommonAPI.unblock(blocker, blocked)
+      refute User.blocks?(blocker, blocked)
+    end
+  end
+
   describe "deletion" do
     test "it works with pruned objects" do
       user = insert(:user)