make conversation-id deterministic (#154)
[akkoma] / lib / pleroma / web / mastodon_api / views / status_view.ex
index e4057f108850c27bbaa6dd9378685c5250c0f238..f0ecf685ba11ab589233cf9acc91a07c0bd6083c 100644 (file)
@@ -57,11 +57,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
     end)
   end
 
-  defp get_context_id(%{data: %{"context_id" => context_id}}) when not is_nil(context_id),
-    do: context_id
-
   defp get_context_id(%{data: %{"context" => context}}) when is_binary(context),
-    do: Utils.context_to_conversation_id(context)
+    do: :erlang.crc32(context)
 
   defp get_context_id(_), do: nil
 
@@ -80,7 +77,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
 
   def render("index.json", opts) do
     reading_user = opts[:for]
-
     # To do: check AdminAPIControllerTest on the reasons behind nil activities in the list
     activities = Enum.filter(opts.activities, & &1)
 
@@ -304,6 +300,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
         _e ->
           nil
       end
+
     emoji_reactions =
       object.data
       |> Map.get("reactions", [])
@@ -329,6 +326,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
 
     {pinned?, pinned_at} = pin_data(object, user)
 
+    quote = Activity.get_quoted_activity_from_object(object)
+
     %{
       id: to_string(activity.id),
       uri: object.data["id"],
@@ -363,6 +362,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
       application: build_application(object.data["generator"]),
       language: nil,
       emojis: build_emojis(object.data["emoji"]),
+      quote_id: if(quote, do: quote.id, else: nil),
+      quote: maybe_render_quote(quote, opts),
       pleroma: %{
         local: activity.local,
         conversation_id: get_context_id(activity),
@@ -375,6 +376,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
         emoji_reactions: emoji_reactions,
         parent_visible: visible_for_user?(reply_to, opts[:for]),
         pinned_at: pinned_at
+      },
+      akkoma: %{
+        source: object.data["source"]
       }
     }
   end
@@ -572,7 +576,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
     %{
       name: emoji,
       count: length(users),
-      url: url,
+      url: MediaProxy.url(url),
       me: !!(current_user && current_user.ap_id in users)
     }
   end
@@ -601,4 +605,19 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
   end
 
   defp build_image_url(_, _), do: nil
+
+  defp maybe_render_quote(nil, _), do: nil
+
+  defp maybe_render_quote(quote, opts) do
+    if opts[:do_not_recurse] || !visible_for_user?(quote, opts[:for]) do
+      nil
+    else
+      opts =
+        opts
+        |> Map.put(:activity, quote)
+        |> Map.put(:do_not_recurse, true)
+
+      render("show.json", opts)
+    end
+  end
 end