Skip to content

Commit f3035a8

Browse files
authored
Handle Reject of a FeatureRequest (mastodon#38256)
1 parent 90840b3 commit f3035a8

4 files changed

Lines changed: 35 additions & 9 deletions

File tree

app/lib/activitypub/activity.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@ def follow_from_object
167167
@follow_from_object ||= ::Follow.find_by(target_account: @account, uri: object_uri) unless object_uri.nil?
168168
end
169169

170+
def feature_request_from_object
171+
return @collection_item if instance_variable_defined?(:@collection_item)
172+
173+
@collection_item = CollectionItem.local.find_by(activity_uri: value_or_id(@object), account_id: @account.id)
174+
end
175+
170176
def fetch_remote_original_status
171177
if object_uri.start_with?('http')
172178
return if ActivityPub::TagManager.instance.local_uri?(object_uri)

app/lib/activitypub/activity/accept.rb

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,4 @@ def relay_follow?
8484
def target_uri
8585
@target_uri ||= value_or_id(@object['actor'])
8686
end
87-
88-
def feature_request_from_object
89-
return @collection_item if instance_variable_defined?(:@collection_item)
90-
91-
@collection_item = CollectionItem.local.find_by(activity_uri: value_or_id(@object), account_id: @account.id)
92-
end
9387
end

app/lib/activitypub/activity/reject.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ def perform
66
return follow_request_from_object.reject! unless follow_request_from_object.nil?
77
return UnfollowService.new.call(follow_from_object.account, @account) unless follow_from_object.nil?
88
return reject_quote!(quote_request_from_object) unless quote_request_from_object.nil?
9+
return reject_feature_request! unless feature_request_from_object.nil?
910

1011
case @object['type']
1112
when 'Follow'
@@ -46,6 +47,13 @@ def reject_quote!(quote)
4647
quote.reject!
4748
end
4849

50+
def reject_feature_request!
51+
collection_item = feature_request_from_object
52+
return unless collection_item.account == @account && collection_item.local?
53+
54+
collection_item.destroy!
55+
end
56+
4957
def relay
5058
@relay ||= Relay.find_by(follow_activity_id: object_uri) unless object_uri.nil?
5159
end

spec/lib/activitypub/activity/reject_spec.rb

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
require 'rails_helper'
44

55
RSpec.describe ActivityPub::Activity::Reject do
6-
let(:sender) { Fabricate(:account) }
6+
let(:sender) { Fabricate(:remote_account) }
77
let(:recipient) { Fabricate(:account) }
88

99
let(:json) do
@@ -129,12 +129,12 @@
129129
context 'with a QuoteRequest' do
130130
let(:status) { Fabricate(:status, account: recipient) }
131131
let(:quoted_status) { Fabricate(:status, account: sender) }
132-
let(:quote) { Fabricate(:quote, status: status, quoted_status: quoted_status, activity_uri: 'https://abc-123/456') }
132+
let!(:quote) { Fabricate(:quote, status: status, quoted_status: quoted_status) }
133133
let(:approval_uri) { "https://#{sender.domain}/approvals/1" }
134134

135135
let(:object_json) do
136136
{
137-
id: 'https://abc-123/456',
137+
id: quote.activity_uri,
138138
type: 'QuoteRequest',
139139
actor: ActivityPub::TagManager.instance.uri_for(recipient),
140140
object: ActivityPub::TagManager.instance.uri_for(quoted_status),
@@ -147,5 +147,23 @@
147147
.to change { quote.reload.rejected? }.from(false).to(true)
148148
end
149149
end
150+
151+
context 'with a FeatureRequest' do
152+
let(:collection) { Fabricate(:collection, account: recipient) }
153+
let!(:collection_item) { Fabricate(:collection_item, collection:, account: sender, state: :pending) }
154+
let(:json) do
155+
{
156+
'id' => 'https://example.com/accepts/1',
157+
'type' => 'Accept',
158+
'actor' => sender.uri,
159+
'to' => ActivityPub::TagManager.instance.uri_for(recipient),
160+
'object' => collection_item.activity_uri,
161+
}
162+
end
163+
164+
it 'deletes the collection item' do
165+
expect { subject.perform }.to change(collection.collection_items, :count).by(-1)
166+
end
167+
end
150168
end
151169
end

0 commit comments

Comments
 (0)