end
end
+ def handle_incoming(%{"type" => type} = data, _options) when type in ~w(Add Remove) do
+ with {:ok, %User{} = user} <- ObjectValidator.fetch_actor(data),
+ # maybe locally user doesn't have featured_address
+ {:ok, user} <- maybe_refetch_user(user),
+ %Object{} <- Object.normalize(data["object"], fetch: true) do
+ # Mastodon sends pin/unpin objects without id, to, cc fields
+ data =
+ data
+ |> Map.put_new("id", Utils.generate_activity_id())
+ |> Map.put_new("to", [Pleroma.Constants.as_public()])
+ |> Map.put_new("cc", [user.follower_address])
+
+ case Pipeline.common_pipeline(data,
+ local: false,
+ featured_address: user.featured_address
+ ) do
+ {:ok, activity, _meta} -> {:ok, activity}
+ error -> error
+ end
+ end
+ end
+
def handle_incoming(
%{"type" => "Delete"} = data,
_options
def handle_incoming(_, _), do: :error
+ defp maybe_refetch_user(%User{featured_address: address} = user) when is_binary(address) do
+ {:ok, user}
+ end
+
+ defp maybe_refetch_user(%User{ap_id: ap_id}), do: upgrade_user_from_ap_id(ap_id)
+
@spec get_obj_helper(String.t(), Keyword.t()) :: {:ok, Object.t()} | nil
def get_obj_helper(id, options \\ []) do
options = Keyword.put(options, :fetch, true)
with %User{local: false} = user <- User.get_cached_by_ap_id(ap_id),
{:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id),
{:ok, user} <- update_user(user, data) do
+ {:ok, _pid} = Task.start(fn -> ActivityPub.pinned_fetch_task(user) end)
TransmogrifierWorker.enqueue("user_upgrade", %{"user_id" => user.id})
{:ok, user}
else