Merge branch 'fix/1658-invite-send' into 'develop'
[akkoma] / lib / pleroma / web / activity_pub / transmogrifier.ex
index dbb14e9aa2be8e0f76a3e7283cf777affb085265..0a8ad62ad28c2ceb04398b707fa34d65b63e6c10 100644 (file)
@@ -232,7 +232,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     Map.put(object, "url", url["href"])
   end
 
-  def fix_url(%{"type" => "Video", "url" => url} = object) when is_list(url) do
+  def fix_url(%{"type" => object_type, "url" => url} = object)
+      when object_type in ["Video", "Audio"] and is_list(url) do
     first_element = Enum.at(url, 0)
 
     link_element = Enum.find(url, fn x -> is_map(x) and x["mimeType"] == "text/html" end)
@@ -401,7 +402,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
         %{"type" => "Create", "object" => %{"type" => objtype} = object} = data,
         options
       )
-      when objtype in ["Article", "Event", "Note", "Video", "Page", "Question", "Answer"] do
+      when objtype in ["Article", "Event", "Note", "Video", "Page", "Question", "Answer", "Audio"] do
     actor = Containment.get_actor(data)
 
     data =
@@ -615,12 +616,11 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     with {_, {:ok, cast_data_sym}} <-
            {:casting_data,
             data |> LikeValidator.cast_data() |> Ecto.Changeset.apply_action(:insert)},
-         {_, cast_data} <-
-           {:stringify_keys, ObjectValidator.stringify_keys(cast_data_sym |> Map.from_struct())},
+         cast_data = ObjectValidator.stringify_keys(Map.from_struct(cast_data_sym)),
          :ok <- ObjectValidator.fetch_actor_and_object(cast_data),
-         {_, {:ok, cast_data}} <- {:maybe_add_context, maybe_add_context_from_object(cast_data)},
+         {_, {:ok, cast_data}} <- {:ensure_context_presence, ensure_context_presence(cast_data)},
          {_, {:ok, cast_data}} <-
-           {:maybe_add_recipients, maybe_add_recipients_from_object(cast_data)},
+           {:ensure_recipients_presence, ensure_recipients_presence(cast_data)},
          {_, {:ok, activity, _meta}} <-
            {:common_pipeline, Pipeline.common_pipeline(cast_data, local: false)} do
       {:ok, activity}
@@ -1115,13 +1115,11 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   end
 
   def add_mention_tags(object) do
-    mentions =
-      object
-      |> Utils.get_notified_from_object()
-      |> Enum.map(&build_mention_tag/1)
+    {enabled_receivers, disabled_receivers} = Utils.get_notified_from_object(object)
+    potential_receivers = enabled_receivers ++ disabled_receivers
+    mentions = Enum.map(potential_receivers, &build_mention_tag/1)
 
     tags = object["tag"] || []
-
     Map.put(object, "tag", tags ++ mentions)
   end
 
@@ -1252,46 +1250,44 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
 
   def maybe_fix_user_object(data), do: maybe_fix_user_url(data)
 
-  defp maybe_add_context_from_object(%{"context" => context} = data) when is_binary(context),
+  defp ensure_context_presence(%{"context" => context} = data) when is_binary(context),
     do: {:ok, data}
 
-  defp maybe_add_context_from_object(%{"object" => object} = data) when is_binary(object) do
-    if object = Object.normalize(object) do
-      data =
-        data
-        |> Map.put("context", object.data["context"])
-
-      {:ok, data}
+  defp ensure_context_presence(%{"object" => object} = data) when is_binary(object) do
+    with %{data: %{"context" => context}} when is_binary(context) <- Object.normalize(object) do
+      {:ok, Map.put(data, "context", context)}
     else
-      {:error, "No context on referenced object"}
+      _ ->
+        {:error, :no_context}
     end
   end
 
-  defp maybe_add_context_from_object(_) do
-    {:error, "No referenced object"}
+  defp ensure_context_presence(_) do
+    {:error, :no_context}
   end
 
-  defp maybe_add_recipients_from_object(%{"object" => object} = data) do
-    to = data["to"] || []
-    cc = data["cc"] || []
+  defp ensure_recipients_presence(%{"to" => [_ | _], "cc" => [_ | _]} = data),
+    do: {:ok, data}
 
-    if to == [] && cc == [] do
-      if object = Object.normalize(object) do
+  defp ensure_recipients_presence(%{"object" => object} = data) do
+    case Object.normalize(object) do
+      %{data: %{"actor" => actor}} ->
         data =
           data
-          |> Map.put("to", [object.data["actor"]])
-          |> Map.put("cc", cc)
+          |> Map.put("to", [actor])
+          |> Map.put("cc", data["cc"] || [])
 
         {:ok, data}
-      else
-        {:error, "No actor on referenced object"}
-      end
-    else
-      {:ok, data}
+
+      nil ->
+        {:error, :no_object}
+
+      _ ->
+        {:error, :no_actor}
     end
   end
 
-  defp maybe_add_recipients_from_object(_) do
-    {:error, "No referenced object"}
+  defp ensure_recipients_presence(_) do
+    {:error, :no_object}
   end
 end