alias Pleroma.Activity
alias Pleroma.Repo
alias Pleroma.Web.ActivityPub.ActivityPub
+ alias Pleroma.Web.ActivityPub.Utils
import Ecto.Query
end
end
+ defp get_follow_activity(follow_object) do
+ cond do
+ is_map(follow_object) ->
+ {:ok, follow_object}
+
+ is_binary(follow_object) ->
+ object = get_obj_helper(follow_object) || ActivityPub.fetch_object_from_id(follow_object)
+ if object do
+ {:ok, object}
+ else
+ {:error, nil}
+ end
+
+ true ->
+ {:error, nil}
+ end
+ end
+
+ def handle_incoming(
+ %{"type" => "Accept", "object" => follow_object, "actor" => actor, "id" => id} = data
+ ) do
+ with %User{} = followed <- User.get_or_fetch_by_ap_id(actor),
+ {:ok, follow_activity} <- get_follow_activity(follow_object),
+ %User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity["actor"]) do
+ User.follow(follower, followed)
+
+ {:ok, data}
+ end
+ end
+
+ def handle_incoming(
+ %{"type" => "Reject", "object" => follow_object, "actor" => actor, "id" => id} = data
+ ) do
+ with %User{} = followed <- User.get_or_fetch_by_ap_id(actor),
+ {:ok, follow_activity} <- get_follow_activity(follow_object),
+ %User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity["actor"]),
+ {:ok, follow_activity} <- Utils.fetch_latest_follow(follower, followed),
+ {:ok, activity} <- ActivityPub.delete(follow_activity, false) do
+ {:ok, activity}
+ end
+ end
+
def handle_incoming(
%{"type" => "Like", "object" => object_id, "actor" => actor, "id" => id} = _data
) do
def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
with %User{} = followed <- Repo.get(User, id),
- {:ok, follower} <- User.follow(follower, followed),
{:ok, _activity} <- ActivityPub.follow(follower, followed) do
render(conn, AccountView, "relationship.json", %{user: follower, target: followed})
else
def follow(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
with %User{} = followed <- Repo.get_by(User, nickname: uri),
- {:ok, follower} <- User.follow(follower, followed),
{:ok, _activity} <- ActivityPub.follow(follower, followed) do
render(conn, AccountView, "account.json", %{user: followed})
else