mirror of
https://github.com/mastodon/mastodon.git
synced 2026-03-21 18:05:23 -05:00
38 lines
1.1 KiB
Ruby
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)
|
|
end
|
|
end
|
|
|
|
def activity_json
|
|
ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::AddFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json
|
|
end
|
|
end
|