+
+ defp maybe_fetch_object(%{"object" => %{} = object} = activity) do
+ # If we don't have an ID, we may have to fetch the object
+ if Map.has_key?(object, "id") do
+ # Do nothing
+ activity
+ else
+ Map.put(activity, "object", fetch_transient_object(object))
+ end
+ end
+
+ defp maybe_fetch_object(activity), do: activity
+
+ defp fetch_transient_object(
+ %{"actor" => actor, "object" => target, "type" => "Follow"} = object
+ ) do
+ with %User{} = actor <- User.get_cached_by_ap_id(actor),
+ %User{local: true} = target <- User.get_cached_by_ap_id(target),
+ %Activity{} = activity <- Activity.follow_activity(actor, target) do
+ activity.data
+ else
+ _e ->
+ object
+ end
+ end
+
+ defp fetch_transient_object(_), do: {:error, "not a supported transient object"}