transmogrifier: pro-actively add support for Hashtag without array in tag
[akkoma] / lib / pleroma / web / activity_pub / transmogrifier.ex
index a37c8477fdc111f55dbeb96049d809070035001d..291d7d16920ebcf062b62ed1e49d8b7c66498e21 100644 (file)
@@ -99,12 +99,12 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   def fix_in_reply_to(%{"inReplyTo" => in_reply_to} = object)
       when not is_nil(in_reply_to) do
     in_reply_to_id =
-      if is_bitstring(in_reply_to) do
-        in_reply_to
-      else
-        if is_map(in_reply_to) && in_reply_to["id"] do
-          in_reply_to["id"]
-        end
+      cond do
+        is_bitstring(in_reply_to) -> in_reply_to
+        is_map(in_reply_to) && is_bitstring(in_reply_to["id"]) -> in_reply_to["id"]
+        is_list(in_reply_to) && is_bitstring(Enum.at(in_reply_to, 0)) -> Enum.at(in_reply_to, 0)
+        # Maybe I should output an error too?
+        true -> ""
       end
 
     case ActivityPub.fetch_object_from_id(in_reply_to_id) do
@@ -194,18 +194,29 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     object
   end
 
-  def fix_tag(object) do
+  def fix_tag(%{"tag" => tag} = object) when is_list(tag) do
     tags =
-      (object["tag"] || [])
+      tag
       |> Enum.filter(fn data -> data["type"] == "Hashtag" and data["name"] end)
       |> Enum.map(fn data -> String.slice(data["name"], 1..-1) end)
 
-    combined = (object["tag"] || []) ++ tags
+    combined = tag ++ tags
+
+    object
+    |> Map.put("tag", combined)
+  end
+
+  def fix_tag(%{"tag" => %{"type" => "Hashtag"} = tag} = object) do
+    combined = [tag ++ String.slice(tag["name"], 1..-1)]
 
     object
     |> Map.put("tag", combined)
   end
 
+  def fix_tag(object) do
+    object
+  end
+
   # content map usually only has one language so this will do for now.
   def fix_content_map(%{"contentMap" => content_map} = object) do
     content_groups = Map.to_list(content_map)