StatusView: show quoted posts through the API, probably

This commit is contained in:
Alex Gleason 2022-01-22 19:47:08 -06:00 committed by tusooa
parent cc4badaf60
commit ce5eb31723
No known key found for this signature in database
GPG Key ID: 42AEC43D48433C51
1 changed files with 41 additions and 1 deletions

View File

@ -57,6 +57,27 @@ defp get_replied_to_activities(activities) do
end) end)
end end
defp get_quoted_activities([]), do: %{}
defp get_quoted_activities(activities) do
activities
|> Enum.map(fn
%{data: %{"type" => "Create"}} = activity ->
object = Object.normalize(activity, fetch: false)
object && object.data["quoteUrl"] != "" && object.data["quoteUrl"]
_ ->
nil
end)
|> Enum.filter(& &1)
|> Activity.create_by_object_ap_id_with_object()
|> Repo.all()
|> Enum.reduce(%{}, fn activity, acc ->
object = Object.normalize(activity, fetch: false)
if object, do: Map.put(acc, object.data["id"], activity), else: acc
end)
end
# DEPRECATED This field seems to be a left-over from the StatusNet era. # DEPRECATED This field seems to be a left-over from the StatusNet era.
# If your application uses `pleroma.conversation_id`: this field is deprecated. # If your application uses `pleroma.conversation_id`: this field is deprecated.
# It is currently stubbed instead by doing a CRC32 of the context, and # It is currently stubbed instead by doing a CRC32 of the context, and
@ -97,6 +118,7 @@ def render("index.json", opts) do
# length(activities_with_links) * timeout # length(activities_with_links) * timeout
fetch_rich_media_for_activities(activities) fetch_rich_media_for_activities(activities)
replied_to_activities = get_replied_to_activities(activities) replied_to_activities = get_replied_to_activities(activities)
quoted_activities = get_quoted_activities(activities)
parent_activities = parent_activities =
activities activities
@ -129,6 +151,7 @@ def render("index.json", opts) do
opts = opts =
opts opts
|> Map.put(:replied_to_activities, replied_to_activities) |> Map.put(:replied_to_activities, replied_to_activities)
|> Map.put(:quoted_activities, quoted_activities)
|> Map.put(:parent_activities, parent_activities) |> Map.put(:parent_activities, parent_activities)
|> Map.put(:relationships, relationships_opt) |> Map.put(:relationships, relationships_opt)
@ -277,7 +300,6 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity}
end end
reply_to = get_reply_to(activity, opts) reply_to = get_reply_to(activity, opts)
reply_to_user = reply_to && CommonAPI.get_user(reply_to.data["actor"]) reply_to_user = reply_to && CommonAPI.get_user(reply_to.data["actor"])
history_len = history_len =
@ -290,6 +312,8 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity}
# Here the implicit index of the current content is 0 # Here the implicit index of the current content is 0
chrono_order = history_len - 1 chrono_order = history_len - 1
quote_activity = get_quote(activity, opts)
content = content =
object object
|> render_content() |> render_content()
@ -398,6 +422,7 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity}
conversation_id: get_context_id(activity), conversation_id: get_context_id(activity),
context: object.data["context"], context: object.data["context"],
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname, in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
quote_id: quote_activity && to_string(quote_activity.id),
content: %{"text/plain" => content_plaintext}, content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary}, spoiler_text: %{"text/plain" => summary},
expires_at: expires_at, expires_at: expires_at,
@ -633,6 +658,21 @@ def get_reply_to(%{data: %{"object" => _object}} = activity, _) do
end end
end end
def get_quote(activity, %{quoted_activities: quoted_activities}) do
object = Object.normalize(activity, fetch: false)
quoted_activities[object.data["quoteUrl"]]
end
def get_quote(%{data: %{"object" => _object}} = activity, _) do
object = Object.normalize(activity, fetch: false)
if object.data["quoteUrl"] && object.data["quoteUrl"] != "" do
Activity.get_create_by_object_ap_id(object.data["quoteUrl"])
else
nil
end
end
def render_content(%{data: %{"name" => name}} = object) when not is_nil(name) and name != "" do def render_content(%{data: %{"name" => name}} = object) when not is_nil(name) and name != "" do
url = object.data["url"] || object.data["id"] url = object.data["url"] || object.data["id"]