From 5d73dca064df5349d2170d56da6727a52d0d44a8 Mon Sep 17 00:00:00 2001
From: rinpatch <rinpatch@sdf.org>
Date: Mon, 15 Apr 2019 11:50:36 +0300
Subject: [PATCH 1/2] Remove inReplyToStatusId

---
 CHANGELOG.md                                  |  1 +
 lib/pleroma/activity.ex                       | 60 ++++++++++---------
 lib/pleroma/web/activity_pub/activity_pub.ex  |  9 ++-
 .../web/activity_pub/transmogrifier.ex        |  3 +-
 lib/pleroma/web/common_api/utils.ex           |  1 -
 .../web/twitter_api/views/activity_view.ex    |  2 +-
 test/activity_test.exs                        | 14 +++++
 test/web/activity_pub/transmogrifier_test.exs |  2 -
 .../mastodon_api_controller_test.exs          |  4 +-
 test/web/twitter_api/twitter_api_test.exs     |  2 +-
 10 files changed, 56 insertions(+), 42 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index cf751a496..ebf21851b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -30,6 +30,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Link/mention/hashtag detection is now handled by [auto_linker](https://git.pleroma.social/pleroma/auto_linker)
 - NodeInfo: Return `safe_dm_mentions` feature flag
 - Federation: Expand the audience of delete activities to all recipients of the deleted object
+- Federation: Removed `inReplyToStatusId` from objects
 - Configuration: Dedupe enabled by default
 - Pleroma API: Support for emoji tags in `/api/pleroma/emoji` resulting in a breaking API change
 - Mastodon API: Support for `exclude_types`, `limit` and `min_id` in `/api/v1/notifications`
diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex
index ab8861b27..e6507e5ca 100644
--- a/lib/pleroma/activity.ex
+++ b/lib/pleroma/activity.ex
@@ -246,20 +246,22 @@ def all_by_actor_and_id(actor, status_ids) do
     |> Repo.all()
   end
 
-  def increase_replies_count(id) do
-    Activity
-    |> where(id: ^id)
-    |> update([a],
-      set: [
-        data:
-          fragment(
-            """
-            jsonb_set(?, '{object, repliesCount}',
-              (coalesce((?->'object'->>'repliesCount')::int, 0) + 1)::varchar::jsonb, true)
-            """,
-            a.data,
-            a.data
-          )
+  def increase_replies_count(nil), do: nil
+
+  def increase_replies_count(object_ap_id) do
+    from(a in create_by_object_ap_id(object_ap_id),
+      update: [
+        set: [
+          data:
+            fragment(
+              """
+              jsonb_set(?, '{object, repliesCount}',
+                (coalesce((?->'object'->>'repliesCount')::int, 0) + 1)::varchar::jsonb, true)
+              """,
+              a.data,
+              a.data
+            )
+        ]
       ]
     )
     |> Repo.update_all([])
@@ -269,20 +271,22 @@ def increase_replies_count(id) do
     end
   end
 
-  def decrease_replies_count(id) do
-    Activity
-    |> where(id: ^id)
-    |> update([a],
-      set: [
-        data:
-          fragment(
-            """
-            jsonb_set(?, '{object, repliesCount}',
-              (greatest(0, (?->'object'->>'repliesCount')::int - 1))::varchar::jsonb, true)
-            """,
-            a.data,
-            a.data
-          )
+  def decrease_replies_count(nil), do: nil
+
+  def decrease_replies_count(object_ap_id) do
+    from(a in create_by_object_ap_id(object_ap_id),
+      update: [
+        set: [
+          data:
+            fragment(
+              """
+              jsonb_set(?, '{object, repliesCount}',
+                (greatest(0, (?->'object'->>'repliesCount')::int - 1))::varchar::jsonb, true)
+              """,
+              a.data,
+              a.data
+            )
+        ]
       ]
     )
     |> Repo.update_all([])
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 89fee2d9f..54dd4097c 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -91,12 +91,11 @@ def decrease_note_count_if_public(actor, object) do
   end
 
   def increase_replies_count_if_reply(%{
-        "object" =>
-          %{"inReplyTo" => reply_ap_id, "inReplyToStatusId" => reply_status_id} = object,
+        "object" => %{"inReplyTo" => reply_ap_id} = object,
         "type" => "Create"
       }) do
     if is_public?(object) do
-      Activity.increase_replies_count(reply_status_id)
+      Activity.increase_replies_count(reply_ap_id)
       Object.increase_replies_count(reply_ap_id)
     end
   end
@@ -104,10 +103,10 @@ def increase_replies_count_if_reply(%{
   def increase_replies_count_if_reply(_create_data), do: :noop
 
   def decrease_replies_count_if_reply(%Object{
-        data: %{"inReplyTo" => reply_ap_id, "inReplyToStatusId" => reply_status_id} = object
+        data: %{"inReplyTo" => reply_ap_id} = object
       }) do
     if is_public?(object) do
-      Activity.decrease_replies_count(reply_status_id)
+      Activity.decrease_replies_count(reply_ap_id)
       Object.decrease_replies_count(reply_ap_id)
     end
   end
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 49ea73204..39cd31921 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -225,12 +225,11 @@ def fix_in_reply_to(%{"inReplyTo" => in_reply_to} = object)
 
     case fetch_obj_helper(in_reply_to_id) do
       {:ok, replied_object} ->
-        with %Activity{} = activity <-
+        with %Activity{} = _activity <-
                Activity.get_create_by_object_ap_id(replied_object.data["id"]) do
           object
           |> Map.put("inReplyTo", replied_object.data["id"])
           |> Map.put("inReplyToAtomUri", object["inReplyToAtomUri"] || in_reply_to_id)
-          |> Map.put("inReplyToStatusId", activity.id)
           |> Map.put("conversation", replied_object.data["context"] || object["conversation"])
           |> Map.put("context", replied_object.data["context"] || object["conversation"])
         else
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index 58a561a40..185292878 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -228,7 +228,6 @@ def make_note_data(
     if inReplyTo do
       object
       |> Map.put("inReplyTo", inReplyTo.data["object"]["id"])
-      |> Map.put("inReplyToStatusId", inReplyTo.id)
     else
       object
     end
diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex
index 433322eb8..ecb2b437b 100644
--- a/lib/pleroma/web/twitter_api/views/activity_view.ex
+++ b/lib/pleroma/web/twitter_api/views/activity_view.ex
@@ -291,7 +291,7 @@ def render(
       "is_local" => activity.local,
       "is_post_verb" => true,
       "created_at" => created_at,
-      "in_reply_to_status_id" => object["inReplyToStatusId"],
+      "in_reply_to_status_id" => reply_parent && reply_parent.id,
       "in_reply_to_screen_name" => reply_user && reply_user.nickname,
       "in_reply_to_profileurl" => User.profile_url(reply_user),
       "in_reply_to_ostatus_uri" => reply_user && reply_user.ap_id,
diff --git a/test/activity_test.exs b/test/activity_test.exs
index ad889f544..d8063bf11 100644
--- a/test/activity_test.exs
+++ b/test/activity_test.exs
@@ -28,4 +28,18 @@ test "returns the activity that created an object" do
 
     assert activity == found_activity
   end
+
+  test "reply count" do
+    %{id: id, data: %{"object" => %{"id" => object_ap_id}}} = activity = insert(:note_activity)
+
+    repliesCount = activity.data["object"]["repliesCount"] || 0
+    expected_increase = repliesCount + 1
+    Activity.increase_replies_count(object_ap_id)
+    %{data: %{"object" => %{"repliesCount" => actual_increase}}} = Activity.get_by_id(id)
+    assert expected_increase == actual_increase
+    expected_decrease = expected_increase - 1
+    Activity.decrease_replies_count(object_ap_id)
+    %{data: %{"object" => %{"repliesCount" => actual_decrease}}} = Activity.get_by_id(id)
+    assert expected_decrease == actual_decrease
+  end
 end
diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs
index 47cffe257..c857a7ec1 100644
--- a/test/web/activity_pub/transmogrifier_test.exs
+++ b/test/web/activity_pub/transmogrifier_test.exs
@@ -58,8 +58,6 @@ test "it fetches replied-to activities if we don't have them" do
 
       assert returned_activity.data["object"]["inReplyToAtomUri"] ==
                "https://shitposter.club/notice/2827873"
-
-      assert returned_activity.data["object"]["inReplyToStatusId"] == activity.id
     end
 
     test "it works for incoming notices" do
diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs
index 292cd46b8..df3315022 100644
--- a/test/web/mastodon_api/mastodon_api_controller_test.exs
+++ b/test/web/mastodon_api/mastodon_api_controller_test.exs
@@ -342,7 +342,7 @@ test "replying to a status", %{conn: conn} do
     activity = Activity.get_by_id(id)
 
     assert activity.data["context"] == replied_to.data["context"]
-    assert activity.data["object"]["inReplyToStatusId"] == replied_to.id
+    assert Activity.get_in_reply_to_activity(activity).id == replied_to.id
   end
 
   test "posting a status with an invalid in_reply_to_id", %{conn: conn} do
@@ -2724,7 +2724,7 @@ test "Repeated posts that are replies incorrectly have in_reply_to_id null", %{c
     activity = Activity.get_by_id(id)
 
     assert activity.data["object"]["inReplyTo"] == replied_to.data["object"]["id"]
-    assert activity.data["object"]["inReplyToStatusId"] == replied_to.id
+    assert Activity.get_in_reply_to_activity(activity).id == replied_to.id
 
     # Reblog from the third user
     conn2 =
diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs
index 6d43bd13a..8781061d4 100644
--- a/test/web/twitter_api/twitter_api_test.exs
+++ b/test/web/twitter_api/twitter_api_test.exs
@@ -105,7 +105,7 @@ test "create a status that is a reply" do
              get_in(activity.data, ["object", "context"])
 
     assert get_in(reply.data, ["object", "inReplyTo"]) == get_in(activity.data, ["object", "id"])
-    assert get_in(reply.data, ["object", "inReplyToStatusId"]) == activity.id
+    assert Activity.get_in_reply_to_activity(reply).id == activity.id
   end
 
   test "Follow another user using user_id" do

From fd2e31af867379f15f1aed536cdfa779a50b812a Mon Sep 17 00:00:00 2001
From: rinpatch <rinpatch@sdf.org>
Date: Mon, 15 Apr 2019 11:59:01 +0300
Subject: [PATCH 2/2] oops

---
 test/activity_test.exs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/test/activity_test.exs b/test/activity_test.exs
index d8063bf11..dc9c56a21 100644
--- a/test/activity_test.exs
+++ b/test/activity_test.exs
@@ -32,8 +32,8 @@ test "returns the activity that created an object" do
   test "reply count" do
     %{id: id, data: %{"object" => %{"id" => object_ap_id}}} = activity = insert(:note_activity)
 
-    repliesCount = activity.data["object"]["repliesCount"] || 0
-    expected_increase = repliesCount + 1
+    replies_count = activity.data["object"]["repliesCount"] || 0
+    expected_increase = replies_count + 1
     Activity.increase_replies_count(object_ap_id)
     %{data: %{"object" => %{"repliesCount" => actual_increase}}} = Activity.get_by_id(id)
     assert expected_increase == actual_increase