diff options
author | multiple creatures <dev@multiple-creature.party> | 2019-12-12 04:38:56 -0600 |
---|---|---|
committer | multiple creatures <dev@multiple-creature.party> | 2019-12-12 04:38:56 -0600 |
commit | a8713ee8b73ef63dab45c3c4db949dbfc49a6381 (patch) | |
tree | 51bc07def409119d246bbbcf4e123ebc0572470a /app/services | |
parent | 90373b7f3190e86882e764d9cf595f7345a97245 (diff) |
add ability for post authors to kick jerks out of their threads
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/remove_status_for_account_service.rb | 38 |
1 files changed, 38 insertions, 0 deletions
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 |