From a8713ee8b73ef63dab45c3c4db949dbfc49a6381 Mon Sep 17 00:00:00 2001 From: multiple creatures Date: Thu, 12 Dec 2019 04:38:56 -0600 Subject: add ability for post authors to kick jerks out of their threads --- app/services/remove_status_for_account_service.rb | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 app/services/remove_status_for_account_service.rb (limited to 'app/services') diff --git a/app/services/remove_status_for_account_service.rb b/app/services/remove_status_for_account_service.rb new file mode 100644 index 000000000..5fa682d01 --- /dev/null +++ b/app/services/remove_status_for_account_service.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +class RemoveStatusForAccountService < BaseService + include Redisable + + def call(account, status) + @account = account + @status = status + @payload = Oj.dump(event: :delete, payload: status.id.to_s) + + RedisLock.acquire(lock_options) do |lock| + if lock.acquired? + remove_from_feeds + remove_from_lists + else + raise Mastodon::RaceConditionError + end + end + end + + private + + def remove_from_feeds + FeedManager.instance.unpush_from_home(@account, @status) + Redis.current.publish("timeline:direct:#{@account.id}", @payload) + redis.publish("timeline:#{@account.id}", @payload) + end + + def remove_from_lists + @account.lists_for_local_distribution.select(:id, :account_id).reorder(nil).find_each do |list| + FeedManager.instance.unpush_from_list(list, @status) + end + end + + def lock_options + { redis: Redis.current, key: "distribute:#{@status.id}" } + end +end -- cgit