From 6f509d71c3ea3fd715bd46d17f6f391f3c800392 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Thu, 26 Mar 2026 15:42:44 +0100 Subject: [PATCH] Make sure collection exists before items are added (#38424) --- .../process_featured_collection_service.rb | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/app/services/activitypub/process_featured_collection_service.rb b/app/services/activitypub/process_featured_collection_service.rb index 80742b081e..9e7c82af42 100644 --- a/app/services/activitypub/process_featured_collection_service.rb +++ b/app/services/activitypub/process_featured_collection_service.rb @@ -17,20 +17,15 @@ class ActivityPub::ProcessFeaturedCollectionService Collection.transaction do @collection = @account.collections.find_or_initialize_by(uri: @json['id']) - @collection.update!( - local: false, - name: (@json['name'] || '')[0, Collection::NAME_LENGTH_HARD_LIMIT], - description_html: truncated_summary, - language:, - sensitive: @json['sensitive'], - discoverable: @json['discoverable'], - original_number_of_items: @json['totalItems'] || 0, - tag_name: @json.dig('topic', 'name') - ) + @collection.update!(collection_attributes) - process_items! + @items = (@json['orderedItems'] || [])[0, ITEMS_LIMIT] + item_uris = @items.filter_map { |i| value_or_id(i) } + @collection.collection_items.where.not(uri: item_uris).delete_all end + process_items! + @collection end end @@ -46,14 +41,22 @@ class ActivityPub::ProcessFeaturedCollectionService @json['summaryMap']&.keys&.first end + def collection_attributes + { + local: false, + name: (@json['name'] || '')[0, Collection::NAME_LENGTH_HARD_LIMIT], + description_html: truncated_summary, + language:, + sensitive: @json['sensitive'], + discoverable: @json['discoverable'], + original_number_of_items: @json['totalItems'] || 0, + tag_name: @json.dig('topic', 'name'), + } + end + def process_items! - uris = [] - items = @json['orderedItems'] || [] - items.take(ITEMS_LIMIT).each_with_index do |item_json, index| - uris << value_or_id(item_json) + @items.each_with_index do |item_json, index| ActivityPub::ProcessFeaturedItemWorker.perform_async(@collection.id, item_json, index + 1, @request_id) end - uris.compact! - @collection.collection_items.where.not(uri: uris).delete_all end end