object: rework Object.normalize() a bit to support transparent fetching
authorWilliam Pitcock <nenolod@dereferenced.org>
Tue, 4 Dec 2018 03:17:25 +0000 (03:17 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Tue, 4 Dec 2018 04:52:09 +0000 (04:52 +0000)
lib/pleroma/object.ex
lib/pleroma/object/fetcher.ex

index 57a8b1d6b08f3664149314ab40c95ba67fd86151..0e9aefb63c2cc1e79a20bf0fd1950b7c6ade90eb 100644 (file)
@@ -1,6 +1,7 @@
 defmodule Pleroma.Object do
   use Ecto.Schema
   alias Pleroma.{Repo, Object, Activity}
+  alias Pleroma.Object.Fetcher
   import Ecto.{Query, Changeset}
 
   schema "objects" do
@@ -27,9 +28,12 @@ defmodule Pleroma.Object do
     Repo.one(from(object in Object, where: fragment("(?)->>'id' = ?", object.data, ^ap_id)))
   end
 
-  def normalize(obj) when is_map(obj), do: normalize(obj["id"])
-  def normalize(ap_id) when is_binary(ap_id), do: get_cached_by_ap_id(ap_id)
-  def normalize(_), do: nil
+  def normalize(_, fetch_remote \\ true)
+
+  def normalize(obj, fetch_remote) when is_map(obj), do: normalize(obj["id"], fetch_remote)
+  def normalize(ap_id, true) when is_binary(ap_id), do: Fetcher.fetch_object_from_id!(ap_id)
+  def normalize(ap_id, false) when is_binary(ap_id), do: get_cached_by_ap_id(ap_id)
+  def normalize(obj, _), do: nil
 
   if Mix.env() == :test do
     def get_cached_by_ap_id(ap_id) do
index c27cb1577c2f4cb906feed227b832498afda7692..c98722f39c23bdc3b7267d15bae5e8673ecbccef 100644 (file)
@@ -17,7 +17,7 @@ defmodule Pleroma.Object.Fetcher do
       Logger.info("Fetching #{id} via AP")
 
       with {:ok, data} <- fetch_and_contain_remote_object_from_id(id),
-           nil <- Object.normalize(data),
+           nil <- Object.normalize(data, false),
            params <- %{
              "type" => "Create",
              "to" => data["to"],
@@ -27,7 +27,7 @@ defmodule Pleroma.Object.Fetcher do
            },
            :ok <- Containment.contain_origin(id, params),
            {:ok, activity} <- Transmogrifier.handle_incoming(params) do
-        {:ok, Object.normalize(activity.data["object"])}
+        {:ok, Object.normalize(activity.data["object"], false)}
       else
         {:error, {:reject, nil}} ->
           {:reject, nil}
@@ -39,13 +39,22 @@ defmodule Pleroma.Object.Fetcher do
           Logger.info("Couldn't get object via AP, trying out OStatus fetching...")
 
           case OStatus.fetch_activity_from_url(id) do
-            {:ok, [activity | _]} -> {:ok, Object.normalize(activity.data["object"])}
+            {:ok, [activity | _]} -> {:ok, Object.normalize(activity.data["object"], false)}
             e -> e
           end
       end
     end
   end
 
+  def fetch_object_from_id!(id) do
+    with {:ok, object} <- fetch_object_from_id(id) do
+      object
+    else
+      _e ->
+        nil
+    end
+  end
+
   def fetch_and_contain_remote_object_from_id(id) do
     Logger.info("Fetching #{id} via AP")