You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mastodon/app/services/create_collection_service.rb

38 lines
1.1 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!
distribute_add_activity if Mastodon::Feature.collections_federation_enabled?
@collection
end
private
def distribute_add_activity
ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @account.id)
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?
@collection.collection_items.build(account: account_to_add, state: :accepted)
end
end
def activity_json
ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::AddFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json
end
end