Browse Source

Implement Undo { Accept { Follow } } (fixes #8234) (#8245)

* Add Follow#revoke_request!

* Implement Undo { Accept { Follow } } (fixes #8234)
master
ThibG 5 years ago
committed by Eugen Rochko
parent
commit
59f7f4c923
4 changed files with 53 additions and 0 deletions
  1. +6
    -0
      app/lib/activitypub/activity/undo.rb
  2. +5
    -0
      app/models/follow.rb
  3. +26
    -0
      spec/lib/activitypub/activity/undo_spec.rb
  4. +16
    -0
      spec/models/follow_spec.rb

+ 6
- 0
app/lib/activitypub/activity/undo.rb View File

@@ -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)



+ 5
- 0
app/models/follow.rb View File

@@ -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



+ 26
- 0
spec/lib/activitypub/activity/undo_spec.rb View File

@@ -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) }



+ 16
- 0
spec/models/follow_spec.rb View File

@@ -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…
Cancel
Save