diff --git a/app/lib/activitypub/activity/remove.rb b/app/lib/activitypub/activity/remove.rb index 2cf411317ec..4a1f8d80be3 100644 --- a/app/lib/activitypub/activity/remove.rb +++ b/app/lib/activitypub/activity/remove.rb @@ -14,6 +14,10 @@ class ActivityPub::Activity::Remove < ActivityPub::Activity end when @account.collections_url remove_collection + else + @collection = @account.collections.find_by(uri: @json['target']) + + remove_collection_item if @collection end end @@ -42,4 +46,10 @@ class ActivityPub::Activity::Remove < ActivityPub::Activity collection&.destroy! end + + def remove_collection_item + collection_item = @collection.collection_items.find_by(uri: value_or_id(@object)) + + collection_item&.destroy! + end end diff --git a/spec/lib/activitypub/activity/remove_spec.rb b/spec/lib/activitypub/activity/remove_spec.rb index e0563e5c4d7..e31b40b9db0 100644 --- a/spec/lib/activitypub/activity/remove_spec.rb +++ b/spec/lib/activitypub/activity/remove_spec.rb @@ -87,5 +87,27 @@ RSpec.describe ActivityPub::Activity::Remove do .and change(CollectionItem, :count).by(-1) end end + + context 'when removing a featured item' do + let(:collection) { Fabricate(:remote_collection, account: sender) } + let(:collection_item) { Fabricate(:collection_item, collection:, uri: 'https://example.com/featured_items/1') } + let(:json) do + { + '@context' => 'https://www.w3.org/ns/activitystreams', + 'id' => 'foo', + 'type' => 'Remove', + 'actor' => ActivityPub::TagManager.instance.uri_for(sender), + 'object' => collection_item.uri, + 'target' => collection.uri, + } + end + + before { json } + + it 'deletes the collection item' do + expect { subject.perform } + .to change(collection.collection_items, :count).by(-1) + end + end end end