forked from cybrespace/mastodon
		
	* Add Follow#revoke_request!
* Implement Undo { Accept { Follow } } (fixes #8234)
			
			
This commit is contained in:
		
							parent
							
								
									1ee675d68b
								
							
						
					
					
						commit
						59f7f4c923
					
				
					 4 changed files with 53 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -5,6 +5,8 @@ class ActivityPub::Activity::Undo < ActivityPub::Activity
 | 
			
		|||
    case @object['type']
 | 
			
		||||
    when 'Announce'
 | 
			
		||||
      undo_announce
 | 
			
		||||
    when 'Accept'
 | 
			
		||||
      undo_accept
 | 
			
		||||
    when 'Follow'
 | 
			
		||||
      undo_follow
 | 
			
		||||
    when 'Like'
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +29,10 @@ class ActivityPub::Activity::Undo < ActivityPub::Activity
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def undo_accept
 | 
			
		||||
    ::Follow.find_by(target_account: @account, uri: target_uri)&.revoke_request!
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def undo_follow
 | 
			
		||||
    target_account = account_from_uri(target_uri)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,11 @@ class Follow < ApplicationRecord
 | 
			
		|||
    false # Force uri_for to use uri attribute
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def revoke_request!
 | 
			
		||||
    FollowRequest.create!(account: account, target_account: target_account, show_reblogs: show_reblogs, uri: uri)
 | 
			
		||||
    destroy!
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  before_validation :set_uri, only: :create
 | 
			
		||||
  after_destroy :remove_endorsements
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,6 +52,32 @@ RSpec.describe ActivityPub::Activity::Undo do
 | 
			
		|||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'with Accept' do
 | 
			
		||||
      let(:recipient) { Fabricate(:account) }
 | 
			
		||||
      let(:object_json) do
 | 
			
		||||
        {
 | 
			
		||||
          id: 'bar',
 | 
			
		||||
          type: 'Accept',
 | 
			
		||||
          actor: ActivityPub::TagManager.instance.uri_for(sender),
 | 
			
		||||
          object: 'follow-to-revoke',
 | 
			
		||||
        }
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      before do
 | 
			
		||||
        recipient.follow!(sender, uri: 'follow-to-revoke')
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'deletes follow from recipient to sender' do
 | 
			
		||||
        subject.perform
 | 
			
		||||
        expect(recipient.following?(sender)).to be false
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'creates a follow request from recipient to sender' do
 | 
			
		||||
        subject.perform
 | 
			
		||||
        expect(recipient.requested?(sender)).to be true
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'with Block' do
 | 
			
		||||
      let(:recipient) { Fabricate(:account) }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,4 +37,20 @@ RSpec.describe Follow, type: :model do
 | 
			
		|||
      expect(a[1]).to eq follow0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'revoke_request!' do
 | 
			
		||||
    let(:follow)         { Fabricate(:follow, account: account, target_account: target_account) }
 | 
			
		||||
    let(:account)        { Fabricate(:account) }
 | 
			
		||||
    let(:target_account) { Fabricate(:account) }
 | 
			
		||||
 | 
			
		||||
    it 'revokes the follow relation' do
 | 
			
		||||
      follow.revoke_request!
 | 
			
		||||
      expect(account.following?(target_account)).to be false
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'creates a follow request' do
 | 
			
		||||
      follow.revoke_request!
 | 
			
		||||
      expect(account.requested?(target_account)).to be true
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue