+ def handle_incoming(
+ %{"type" => "Update", "object" => %{"type" => "Person"} = object, "actor" => actor_id} =
+ data
+ ) do
+ with %User{ap_id: ^actor_id} = actor <- User.get_by_ap_id(object["id"]) do
+ {:ok, new_user_data} = ActivityPub.user_data_from_user_object(object)
+
+ banner = new_user_data[:info]["banner"]
+
+ update_data =
+ new_user_data
+ |> Map.take([:name, :bio, :avatar])
+ |> Map.put(:info, Map.merge(actor.info, %{"banner" => banner}))
+
+ actor
+ |> User.upgrade_changeset(update_data)
+ |> User.update_and_set_cache()
+
+ ActivityPub.update(%{
+ local: false,
+ to: data["to"] || [],
+ cc: data["cc"] || [],
+ object: object,
+ actor: actor_id
+ })
+ else
+ e ->
+ Logger.error(e)
+ :error
+ end
+ end
+
+ # TODO: Make secure.
+ def handle_incoming(
+ %{"type" => "Delete", "object" => object_id, "actor" => actor, "id" => id} = data
+ ) do
+ object_id =
+ case object_id do
+ %{"id" => id} -> id
+ id -> id
+ end
+
+ with %User{} = actor <- User.get_or_fetch_by_ap_id(actor),
+ {:ok, object} <-
+ get_obj_helper(object_id) || ActivityPub.fetch_object_from_id(object_id),
+ {:ok, activity} <- ActivityPub.delete(object, false) do
+ {:ok, activity}
+ else
+ e -> :error
+ end
+ end
+