From 7c3991f59eccc47551257dfe41817e71d0eb6717 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Sun, 9 Feb 2020 10:17:21 +0300 Subject: [PATCH] [#1505] Fixed `replies` serialization (included objects' ids instead of activities' ids). --- lib/pleroma/activity.ex | 19 ---------------- lib/pleroma/object.ex | 22 +++++++++++++++++++ .../web/activity_pub/transmogrifier.ex | 16 +++++++------- test/web/activity_pub/transmogrifier_test.exs | 2 +- .../activity_pub/views/object_view_test.exs | 2 +- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 10b6d7ebd..72e2256ea 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -330,23 +330,4 @@ def direct_conversation_id(activity, for_user) do _ -> nil end end - - def replies(activity, opts \\ []) do - object = Object.normalize(activity) - - query = - Activity - |> Queries.by_type("Create") - |> Queries.by_object_in_reply_to_id(object.data["id"], skip_preloading: true) - |> order_by([activity], asc: activity.id) - - if opts[:self_only] do - where(query, [a], a.actor == ^activity.actor) - else - query - end - end - - def self_replies(activity, opts \\ []), - do: replies(activity, Keyword.put(opts, :self_only, true)) end diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index 52556bf31..f316f8b36 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -301,4 +301,26 @@ def update_data(%Object{data: data} = object, attrs \\ %{}) do def local?(%Object{data: %{"id" => id}}) do String.starts_with?(id, Pleroma.Web.base_url() <> "/") end + + def replies(object, opts \\ []) do + object = Object.normalize(object) + + query = + Object + |> where( + [o], + fragment("(?)->>'inReplyTo' = ?", o.data, ^object.data["id"]) + ) + |> order_by([o], asc: o.id) + + if opts[:self_only] do + actor = object.data["actor"] + where(query, [o], fragment("(?)->>'actor' = ?", o.data, ^actor)) + else + query + end + end + + def self_replies(object, opts \\ []), + do: replies(object, Keyword.put(opts, :self_only, true)) end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 8266545d1..e89588f29 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -407,7 +407,7 @@ def handle_incoming( with nil <- Activity.get_create_by_object_ap_id(object["id"]), {:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(data["actor"]) do options = Keyword.put(options, :depth, (options[:depth] || 0) + 1) - object = fix_object(data["object"], options) + object = fix_object(object, options) params = %{ to: data["to"], @@ -913,20 +913,20 @@ def set_reply_to_uri(obj), do: obj Serialized Mastodon-compatible `replies` collection containing _self-replies_. Based on Mastodon's ActivityPub::NoteSerializer#replies. """ - def set_replies(obj) do + def set_replies(obj_data) do limit = Pleroma.Config.get([:activitypub, :note_replies_output_limit], 0) replies_uris = with true <- limit > 0 || nil, - %Activity{} = activity <- Activity.get_create_by_object_ap_id(obj["id"]) do - activity - |> Activity.self_replies() - |> select([a], fragment("?->>'id'", a.data)) + %Object{} = object <- Object.get_cached_by_ap_id(obj_data["id"]) do + object + |> Object.self_replies() + |> select([o], fragment("?->>'id'", o.data)) |> limit(^limit) |> Repo.all() end - set_replies(obj, replies_uris || []) + set_replies(obj_data, replies_uris || []) end defp set_replies(obj, replies_uris) when replies_uris in [nil, []] do @@ -952,7 +952,7 @@ defp set_replies(obj, replies_uris) do Map.merge(obj, %{"replies" => replies_collection}) end - def replies(%{"replies" => replies = %{}}) do + def replies(%{"replies" => replies} = _object) when is_map(replies) do replies = if is_map(replies["first"]) do replies["first"] diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 3720dda2a..d373762ea 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -2133,7 +2133,7 @@ test "sets `replies` collection with a limited number of self-replies" do }) object = Object.normalize(activity) - replies_uris = Enum.map([self_reply1, self_reply2], fn a -> a.data["id"] end) + replies_uris = Enum.map([self_reply1, self_reply2], fn a -> a.object.data["id"] end) assert %{ "type" => "Collection", diff --git a/test/web/activity_pub/views/object_view_test.exs b/test/web/activity_pub/views/object_view_test.exs index 6784788cc..a9197b0c5 100644 --- a/test/web/activity_pub/views/object_view_test.exs +++ b/test/web/activity_pub/views/object_view_test.exs @@ -48,8 +48,8 @@ test "renders `replies` collection for a note activity" do {:ok, self_reply1} = CommonAPI.post(user, %{"status" => "self-reply 1", "in_reply_to_status_id" => activity.id}) + replies_uris = [self_reply1.object.data["id"]] result = ObjectView.render("object.json", %{object: refresh_record(activity)}) - replies_uris = [self_reply1.data["id"]] assert %{ "type" => "Collection",