Chats: Basic implementation.
[akkoma] / lib / pleroma / web / activity_pub / transmogrifier.ex
index dbb14e9aa2be8e0f76a3e7283cf777affb085265..a4b385cd5c49917914a8184522fb7c6b243001bb 100644 (file)
@@ -615,8 +615,7 @@ 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}} <-
@@ -1256,42 +1255,40 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     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}
+    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"}
+    {:error, :no_context}
   end
 
-  defp maybe_add_recipients_from_object(%{"object" => object} = data) do
-    to = data["to"] || []
-    cc = data["cc"] || []
+  defp maybe_add_recipients_from_object(%{"to" => [_ | _], "cc" => [_ | _]} = data),
+    do: {:ok, data}
 
-    if to == [] && cc == [] do
-      if object = Object.normalize(object) do
+  defp maybe_add_recipients_from_object(%{"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"}
+    {:error, :no_object}
   end
 end