forked from YokaiRick/akkoma
[#1505] Fixed replies
serialization (included objects' ids instead of activities' ids).
This commit is contained in:
parent
4e6bbdc7b5
commit
7c3991f59e
5 changed files with 32 additions and 29 deletions
|
@ -330,23 +330,4 @@ def direct_conversation_id(activity, for_user) do
|
||||||
_ -> nil
|
_ -> nil
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
@ -301,4 +301,26 @@ def update_data(%Object{data: data} = object, attrs \\ %{}) do
|
||||||
def local?(%Object{data: %{"id" => id}}) do
|
def local?(%Object{data: %{"id" => id}}) do
|
||||||
String.starts_with?(id, Pleroma.Web.base_url() <> "/")
|
String.starts_with?(id, Pleroma.Web.base_url() <> "/")
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -407,7 +407,7 @@ def handle_incoming(
|
||||||
with nil <- Activity.get_create_by_object_ap_id(object["id"]),
|
with nil <- Activity.get_create_by_object_ap_id(object["id"]),
|
||||||
{:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(data["actor"]) do
|
{:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(data["actor"]) do
|
||||||
options = Keyword.put(options, :depth, (options[:depth] || 0) + 1)
|
options = Keyword.put(options, :depth, (options[:depth] || 0) + 1)
|
||||||
object = fix_object(data["object"], options)
|
object = fix_object(object, options)
|
||||||
|
|
||||||
params = %{
|
params = %{
|
||||||
to: data["to"],
|
to: data["to"],
|
||||||
|
@ -913,20 +913,20 @@ def set_reply_to_uri(obj), do: obj
|
||||||
Serialized Mastodon-compatible `replies` collection containing _self-replies_.
|
Serialized Mastodon-compatible `replies` collection containing _self-replies_.
|
||||||
Based on Mastodon's ActivityPub::NoteSerializer#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)
|
limit = Pleroma.Config.get([:activitypub, :note_replies_output_limit], 0)
|
||||||
|
|
||||||
replies_uris =
|
replies_uris =
|
||||||
with true <- limit > 0 || nil,
|
with true <- limit > 0 || nil,
|
||||||
%Activity{} = activity <- Activity.get_create_by_object_ap_id(obj["id"]) do
|
%Object{} = object <- Object.get_cached_by_ap_id(obj_data["id"]) do
|
||||||
activity
|
object
|
||||||
|> Activity.self_replies()
|
|> Object.self_replies()
|
||||||
|> select([a], fragment("?->>'id'", a.data))
|
|> select([o], fragment("?->>'id'", o.data))
|
||||||
|> limit(^limit)
|
|> limit(^limit)
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
end
|
end
|
||||||
|
|
||||||
set_replies(obj, replies_uris || [])
|
set_replies(obj_data, replies_uris || [])
|
||||||
end
|
end
|
||||||
|
|
||||||
defp set_replies(obj, replies_uris) when replies_uris in [nil, []] do
|
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})
|
Map.merge(obj, %{"replies" => replies_collection})
|
||||||
end
|
end
|
||||||
|
|
||||||
def replies(%{"replies" => replies = %{}}) do
|
def replies(%{"replies" => replies} = _object) when is_map(replies) do
|
||||||
replies =
|
replies =
|
||||||
if is_map(replies["first"]) do
|
if is_map(replies["first"]) do
|
||||||
replies["first"]
|
replies["first"]
|
||||||
|
|
|
@ -2133,7 +2133,7 @@ test "sets `replies` collection with a limited number of self-replies" do
|
||||||
})
|
})
|
||||||
|
|
||||||
object = Object.normalize(activity)
|
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 %{
|
assert %{
|
||||||
"type" => "Collection",
|
"type" => "Collection",
|
||||||
|
|
|
@ -48,8 +48,8 @@ test "renders `replies` collection for a note activity" do
|
||||||
{:ok, self_reply1} =
|
{:ok, self_reply1} =
|
||||||
CommonAPI.post(user, %{"status" => "self-reply 1", "in_reply_to_status_id" => activity.id})
|
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)})
|
result = ObjectView.render("object.json", %{object: refresh_record(activity)})
|
||||||
replies_uris = [self_reply1.data["id"]]
|
|
||||||
|
|
||||||
assert %{
|
assert %{
|
||||||
"type" => "Collection",
|
"type" => "Collection",
|
||||||
|
|
Loading…
Reference in a new issue