From 9972678a68605d24373f785f783d0fe60f77afdc Mon Sep 17 00:00:00 2001
From: Dashie <dashie@sigpipe.me>
Date: Tue, 24 Apr 2018 11:34:18 +0200
Subject: [PATCH] Add User.decrease_note_count and call it from
 ActivityPub.delete

---
 lib/pleroma/user.ex                          | 10 ++++++++++
 lib/pleroma/web/activity_pub/activity_pub.ex |  3 ++-
 test/user_test.exs                           | 19 +++++++++++++++++++
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index c77fd6816..0bc7dcab0 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -322,6 +322,16 @@ def increase_note_count(%User{} = user) do
     update_and_set_cache(cs)
   end
 
+  def decrease_note_count(%User{} = user) do
+    note_count = (user.info["note_count"] || 0)
+    note_count = if note_count <= 0, do: 0, else: note_count - 1
+    new_info = Map.put(user.info, "note_count", note_count)
+
+    cs = info_changeset(user, %{info: new_info})
+
+    update_and_set_cache(cs)
+  end
+
   def update_note_count(%User{} = user) do
     note_count_query =
       from(
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index d071135c4..448ea8752 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -172,7 +172,8 @@ def delete(%Object{data: %{"id" => id, "actor" => actor}} = object, local \\ tru
     with Repo.delete(object),
          Repo.delete_all(Activity.all_non_create_by_object_ap_id_q(id)),
          {:ok, activity} <- insert(data, local),
-         :ok <- maybe_federate(activity) do
+         :ok <- maybe_federate(activity),
+         {:ok, actor} <- User.decrease_note_count(user) do
       {:ok, activity}
     end
   end
diff --git a/test/user_test.exs b/test/user_test.exs
index 6e9025f2a..9506b58fa 100644
--- a/test/user_test.exs
+++ b/test/user_test.exs
@@ -296,6 +296,25 @@ test "it increases the info->note_count property" do
       assert user.info["note_count"] == 2
     end
 
+    test "it decreases the info->note_count property" do
+      note = insert(:note)
+      user = User.get_by_ap_id(note.data["actor"])
+
+      assert user.info["note_count"] == nil
+
+      {:ok, user} = User.increase_note_count(user)
+
+      assert user.info["note_count"] == 1
+
+      {:ok, user} = User.decrease_note_count(user)
+
+      assert user.info["note_count"] == 0
+
+      {:ok, user} = User.decrease_note_count(user)
+
+      assert user.info["note_count"] == 0
+    end
+
     test "it sets the info->follower_count property" do
       user = insert(:user)
       follower = insert(:user)