+ # 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, fetch: 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, fetch: false)} do
+ {:ok, object}
+ else
+ {:allowed_depth, false} ->
+ {:error, "Max thread distance exceeded."}
+
+ {:containment, _} ->
+ {:error, "Object containment failed."}
+
+ {:transmogrifier, {:error, {:reject, e}}} ->
+ {:reject, e}
+
+ {:transmogrifier, {:reject, e}} ->
+ {:reject, e}
+
+ {:transmogrifier, _} = e ->
+ {:error, e}
+
+ {:object, data, nil} ->
+ reinject_object(%Object{}, data)
+
+ {:normalize, object = %Object{}} ->
+ {:ok, object}
+
+ {:fetch_object, %Object{} = object} ->
+ {:ok, object}