- Logger.info("Fetching #{id} via AP")
-
- with {:ok, data} <- fetch_and_contain_remote_object_from_id(id),
- nil <- Object.normalize(data, false),
- params <- %{
- "type" => "Create",
- "to" => data["to"],
- "cc" => data["cc"],
- "actor" => data["actor"] || data["attributedTo"],
- "object" => data
- },
- :ok <- Containment.contain_origin(id, params),
- {:ok, activity} <- Transmogrifier.handle_incoming(params) do
- {:ok, Object.normalize(activity.data["object"], false)}
- else
- {:error, {:reject, nil}} ->
- {:reject, nil}
-
- object = %Object{} ->
- {:ok, object}
-
- _e ->
- 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"], false)}
- e -> e
- end
- end
+ {:local, true} -> {:ok, object}
+ e -> {:error, e}
+ end
+ end
+
+ # Note: will create a Create activity, which we need internally at the moment.
+ def fetch_object_from_id(id, options \\ []) do
+ with {_, nil} <- {:fetch_object, Object.get_cached_by_ap_id(id)},
+ {_, true} <- {:allowed_depth, Federator.allowed_thread_distance?(options[:depth])},
+ {_, {:ok, data}} <- {:fetch, fetch_and_contain_remote_object_from_id(id)},
+ {_, nil} <- {:normalize, Object.normalize(data, false)},
+ params <- prepare_activity_params(data),
+ {_, :ok} <- {:containment, Containment.contain_origin(id, params)},
+ {_, {:ok, activity}} <-
+ {:transmogrifier, Transmogrifier.handle_incoming(params, options)},
+ {_, _data, %Object{} = object} <-
+ {:object, data, Object.normalize(activity, false)} do
+ {:ok, object}
+ else
+ {:allowed_depth, false} ->
+ {:error, "Max thread distance exceeded."}
+
+ {:containment, _} ->
+ {:error, "Object containment failed."}
+
+ {:transmogrifier, {:error, {:reject, nil}}} ->
+ {:reject, nil}
+
+ {:transmogrifier, _} ->
+ {:error, "Transmogrifier failure."}
+
+ {:object, data, nil} ->
+ reinject_object(%Object{}, data)
+
+ {:normalize, object = %Object{}} ->
+ {:ok, object}
+
+ {:fetch_object, %Object{} = object} ->
+ {:ok, object}
+
+ {:fetch, {:error, error}} ->
+ {:error, error}
+
+ e ->
+ e