Make sure collection exists before items are added (#38424)

This commit is contained in:
David Roetzel
2026-03-26 15:42:44 +01:00
committed by GitHub
parent 71092457e9
commit 6f509d71c3

View File

@@ -17,20 +17,15 @@ class ActivityPub::ProcessFeaturedCollectionService
Collection.transaction do Collection.transaction do
@collection = @account.collections.find_or_initialize_by(uri: @json['id']) @collection = @account.collections.find_or_initialize_by(uri: @json['id'])
@collection.update!( @collection.update!(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')
)
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 end
process_items!
@collection @collection
end end
end end
@@ -46,14 +41,22 @@ class ActivityPub::ProcessFeaturedCollectionService
@json['summaryMap']&.keys&.first @json['summaryMap']&.keys&.first
end 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! def process_items!
uris = [] @items.each_with_index do |item_json, index|
items = @json['orderedItems'] || []
items.take(ITEMS_LIMIT).each_with_index do |item_json, index|
uris << value_or_id(item_json)
ActivityPub::ProcessFeaturedItemWorker.perform_async(@collection.id, item_json, index + 1, @request_id) ActivityPub::ProcessFeaturedItemWorker.perform_async(@collection.id, item_json, index + 1, @request_id)
end end
uris.compact!
@collection.collection_items.where.not(uri: uris).delete_all
end end
end end