def follow(%User{} = follower, %User{info: info} = followed) do
ap_followers = followed.follower_address
- if following?(follower, followed) or info["deactivated"] do
- {:error, "Could not follow user: #{followed.nickname} is already on your list."}
- else
- if !followed.local && follower.local && !ap_enabled?(followed) do
- Websub.subscribe(follower, followed)
- end
+ cond do
+ following?(follower, followed) or info["deactivated"] ->
+ {:error, "Could not follow user: #{followed.nickname} is already on your list."}
- following =
- [ap_followers | follower.following]
- |> Enum.uniq()
+ blocks?(followed, follower) ->
+ {:error, "Could not follow user: #{followed.nickname} blocked you."}
- follower =
- follower
- |> follow_changeset(%{following: following})
- |> update_and_set_cache
+ true ->
+ if !followed.local && follower.local && !ap_enabled?(followed) do
+ Websub.subscribe(follower, followed)
+ end
+
+ following =
+ [ap_followers | follower.following]
+ |> Enum.uniq()
- {:ok, _} = update_follower_count(followed)
+ follower =
+ follower
+ |> follow_changeset(%{following: following})
+ |> update_and_set_cache
- follower
+ {:ok, _} = update_follower_count(followed)
+
+ follower
end
end
{:error, _} = User.follow(user, followed)
end
+ test "can't follow a user who blocked us" do
+ blocker = insert(:user)
+ blockee = insert(:user)
+
+ {:ok, blocker} = User.block(blocker, blockee)
+
+ {:error, _} = User.follow(blockee, blocker)
+ end
+
# This is a somewhat useless test.
# test "following a remote user will ensure a websub subscription is present" do
# user = insert(:user)