aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pleroma/web')
-rw-r--r--lib/pleroma/web/activity_pub/transmogrifier.ex59
1 files changed, 58 insertions, 1 deletions
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 2b8bfc3bd..d129334c2 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -424,7 +424,13 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
])
}
- ActivityPub.create(params)
+ with {:ok, created_activity} <- ActivityPub.create(params) do
+ for reply_id <- replies(object) do
+ Pleroma.Workers.RemoteFetcherWorker.enqueue("fetch_remote", %{"id" => reply_id})
+ end
+
+ {:ok, created_activity}
+ end
else
%Activity{} = activity -> {:ok, activity}
_e -> :error
@@ -903,6 +909,56 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def set_reply_to_uri(obj), do: obj
+ @doc """
+ Serialized Mastodon-compatible `replies` collection containing _self-replies_.
+ Based on Mastodon's ActivityPub::NoteSerializer#replies.
+ """
+ def set_replies(obj) do
+ limit = Pleroma.Config.get([:mastodon_compatibility, :federated_note_replies_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))
+ |> limit(^limit)
+ |> Repo.all()
+ end
+
+ set_replies(obj, replies_uris || [])
+ end
+
+ defp set_replies(obj, replies_uris) when replies_uris in [nil, []] do
+ obj
+ end
+
+ defp set_replies(obj, replies_uris) do
+ # Note: stubs (Mastodon doesn't make separate requests via those URIs in FetchRepliesService)
+ masto_replies_uri = nil
+ masto_replies_next_page_uri = nil
+
+ replies_collection = %{
+ "type" => "Collection",
+ "id" => masto_replies_uri,
+ "first" => %{
+ "type" => "Collection",
+ "part_of" => masto_replies_uri,
+ "items" => replies_uris,
+ "next" => masto_replies_next_page_uri
+ }
+ }
+
+ Map.merge(obj, %{"replies" => replies_collection})
+ end
+
+ def replies(%{"replies" => replies = %{}}) do
+ replies = with %{} <- replies["first"], do: replies["first"], else: (_ -> replies)
+ replies["items"] || []
+ end
+
+ def replies(_), do: []
+
# Prepares the object of an outgoing create activity.
def prepare_object(object) do
object
@@ -914,6 +970,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> prepare_attachments
|> set_conversation
|> set_reply_to_uri
+ |> set_replies
|> strip_internal_fields
|> strip_internal_tags
|> set_type