aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pleroma/activity.ex19
-rw-r--r--lib/pleroma/object.ex22
-rw-r--r--lib/pleroma/web/activity_pub/transmogrifier.ex16
-rw-r--r--test/web/activity_pub/transmogrifier_test.exs2
-rw-r--r--test/web/activity_pub/views/object_view_test.exs2
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 @@ defmodule Pleroma.Activity 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 @@ defmodule Pleroma.Object 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 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
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 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
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 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier 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 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest 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 @@ defmodule Pleroma.Web.ActivityPub.ObjectViewTest 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",