Files
mastodon/app/services/create_collection_service.rb
2026-03-25 13:04:05 +00:00

48 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class CreateCollectionService
def call(params, account)
@account = account
@accounts_to_add = Account.find(params.delete(:account_ids) || [])
@collection = Collection.new(params.merge({ account:, local: true }))
build_items
@collection.save!
if Mastodon::Feature.collections_federation_enabled?
distribute_add_activity
distribute_feature_request_activities
end
@collection
end
private
def distribute_add_activity
ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @account.id)
end
def distribute_feature_request_activities
@collection.collection_items.select(&:local_item_with_remote_account?).each do |collection_item|
ActivityPub::FeatureRequestWorker.perform_async(collection_item.id)
end
end
def build_items
return if @accounts_to_add.empty?
@account.preload_relations!(@accounts_to_add.map(&:id))
@accounts_to_add.each do |account_to_add|
raise Mastodon::NotPermittedError, I18n.t('accounts.errors.cannot_be_added_to_collections') unless AccountPolicy.new(@account, account_to_add).feature?
state = account_to_add.local? ? :accepted : :pending
@collection.collection_items.build(account: account_to_add, state:)
end
end
def activity_json
ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::AddFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json
end
end