Tag linked FeaturedCollection objects over ActivityPub (#38115)

This commit is contained in:
Claire
2026-03-23 14:11:33 +01:00
committed by GitHub
parent 1935f4db79
commit 39d9da3b82
23 changed files with 320 additions and 16 deletions

View File

@@ -42,6 +42,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def process_status
@tags = []
@mentions = []
@tagged_objects = []
@unresolved_mentions = []
@silenced_account_ids = []
@params = {}
@@ -56,6 +57,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
ApplicationRecord.transaction do
@status = Status.create!(@params.merge(quote: @quote))
attach_tags(@status)
attach_tagged_objects(@status)
attach_mentions(@status)
attach_counts(@status)
end
@@ -181,6 +183,13 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
end
def attach_tagged_objects(status)
@tagged_objects.each do |tagged_object|
tagged_object.status = status
tagged_object.save
end
end
def attach_mentions(status)
@mentions.each do |mention|
mention.status = status
@@ -210,6 +219,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
process_mention tag
elsif equals_or_includes?(tag['type'], 'Emoji')
process_emoji tag
elsif equals_or_includes?(tag['type'], 'FeaturedCollection')
process_tagged_collection tag
end
end
end
@@ -266,6 +277,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
end
def process_tagged_collection(tag)
return if tag['id'].blank?
# TODO: We probably want to resolve unknown objects and push them to an `@unresolved_tagged_objects` on failure
collection = ActivityPub::TagManager.instance.uri_to_resource(tag['id'], Collection)
@tagged_objects << TaggedObject.new(uri: ActivityPub::TagManager.instance.uri_for(collection), object: collection, ap_type: 'FeaturedCollection') if collection.present?
end
def process_attachments
return [] if @object['attachment'].nil?

View File

@@ -262,6 +262,14 @@ class ActivityPub::TagManager
uri_to_resource(uri, Account)
end
def uri_to_local_collection(uri)
path_params = Rails.application.routes.recognize_path(uri)
return unless path_params[:controller] == 'collections'
# TODO: check account, but this requires handling potentially two different schemes
Collection.find_by(id: path_params[:id])
end
def uri_to_local_conversation(uri)
path_params = Rails.application.routes.recognize_path(uri)
return unless path_params[:controller] == 'activitypub/contexts'
@@ -279,6 +287,8 @@ class ActivityPub::TagManager
uris_to_local_accounts([uri]).first
when 'Conversation'
uri_to_local_conversation(uri)
when 'Collection'
uri_to_local_collection(uri)
else
StatusFinder.new(uri).status
end