diff options
| author | Haelwenn <contact+git.pleroma.social@hacktivis.me> | 2020-02-07 16:10:43 +0000 | 
|---|---|---|
| committer | Haelwenn <contact+git.pleroma.social@hacktivis.me> | 2020-02-07 16:10:43 +0000 | 
| commit | 1262357ddb4b889337a931a39b3e28bb3d81f944 (patch) | |
| tree | 44ce7bfc2390694a56c12881de56755d5fd04d0e /lib | |
| parent | 8d01aaa7024757f4a64a5e92e84838e35cb0e37e (diff) | |
| parent | bc2e98b20099be767a8262b734c6702edea663b4 (diff) | |
| download | pleroma-1262357ddb4b889337a931a39b3e28bb3d81f944.tar.gz pleroma-1262357ddb4b889337a931a39b3e28bb3d81f944.zip | |
Merge branch 'cancel-follow-request' into 'develop'
Add support for cancellation of a follow request
Closes #1522
See merge request pleroma/pleroma!2175
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/following_relationship.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 43 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/utils.ex | 9 | 
3 files changed, 43 insertions, 11 deletions
| diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index 0b0219b82..b8cb3bf03 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -58,8 +58,8 @@ defmodule Pleroma.FollowingRelationship do    def unfollow(%User{} = follower, %User{} = following) do      case get(follower, following) do -      nil -> {:ok, nil}        %__MODULE__{} = following_relationship -> Repo.delete(following_relationship) +      _ -> {:ok, nil}      end    end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 3c86cdb38..5ea36fea3 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -647,25 +647,48 @@ defmodule Pleroma.User do      end    end +  def unfollow(%User{ap_id: ap_id}, %User{ap_id: ap_id}) do +    {:error, "Not subscribed!"} +  end +    def unfollow(%User{} = follower, %User{} = followed) do -    if following?(follower, followed) and follower.ap_id != followed.ap_id do -      FollowingRelationship.unfollow(follower, followed) +    case get_follow_state(follower, followed) do +      state when state in ["accept", "pending"] -> +        FollowingRelationship.unfollow(follower, followed) +        {:ok, followed} = update_follower_count(followed) -      {:ok, followed} = update_follower_count(followed) +        {:ok, follower} = +          follower +          |> update_following_count() +          |> set_cache() -      {:ok, follower} = -        follower -        |> update_following_count() -        |> set_cache() +        {:ok, follower, Utils.fetch_latest_follow(follower, followed)} -      {:ok, follower, Utils.fetch_latest_follow(follower, followed)} -    else -      {:error, "Not subscribed!"} +      nil -> +        {:error, "Not subscribed!"}      end    end    defdelegate following?(follower, followed), to: FollowingRelationship +  def get_follow_state(%User{} = follower, %User{} = following) do +    following_relationship = FollowingRelationship.get(follower, following) + +    case {following_relationship, following.local} do +      {nil, false} -> +        case Utils.fetch_latest_follow(follower, following) do +          %{data: %{"state" => state}} when state in ["pending", "accept"] -> state +          _ -> nil +        end + +      {%{state: state}, _} -> +        state + +      {nil, _} -> +        nil +    end +  end +    def locked?(%User{} = user) do      user.locked || false    end diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index 4bcacc6d1..10ce5eee8 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -490,6 +490,15 @@ defmodule Pleroma.Web.ActivityPub.Utils do      |> Repo.one()    end +  def fetch_latest_undo(%User{ap_id: ap_id}) do +    "Undo" +    |> Activity.Queries.by_type() +    |> where(actor: ^ap_id) +    |> order_by([activity], fragment("? desc nulls last", activity.id)) +    |> limit(1) +    |> Repo.one() +  end +    def get_latest_reaction(internal_activity_id, %{ap_id: ap_id}, emoji) do      %{data: %{"object" => object_ap_id}} = Activity.get_by_id(internal_activity_id) | 
