You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.0 KiB

  1. # frozen_string_literal: true
  2. class RemoveStatusService < BaseService
  3. include StreamEntryRenderer
  4. def call(status)
  5. remove_from_self(status) if status.account.local?
  6. remove_from_followers(status)
  7. remove_from_mentioned(status)
  8. remove_reblogs(status)
  9. remove_from_hashtags(status)
  10. remove_from_public(status)
  11. status.destroy!
  12. return unless status.account.local?
  13. Pubsubhubbub::DistributionWorker.perform_async(status.stream_entry.id)
  14. end
  15. private
  16. def remove_from_self(status)
  17. unpush(:home, status.account, status)
  18. end
  19. def remove_from_followers(status)
  20. status.account.followers.each do |follower|
  21. next unless follower.local?
  22. unpush(:home, follower, status)
  23. end
  24. end
  25. def remove_from_mentioned(status)
  26. status.mentions.each do |mention|
  27. mentioned_account = mention.account
  28. if mentioned_account.local?
  29. unpush(:mentions, mentioned_account, status)
  30. else
  31. send_delete_salmon(mentioned_account, status)
  32. end
  33. end
  34. end
  35. def send_delete_salmon(account, status)
  36. return unless status.local?
  37. NotificationWorker.perform_async(stream_entry_to_xml(status.stream_entry), status.account_id, account.id)
  38. end
  39. def remove_reblogs(status)
  40. status.reblogs.each do |reblog|
  41. RemoveStatusService.new.call(reblog)
  42. end
  43. end
  44. def unpush(type, receiver, status)
  45. if status.reblog?
  46. redis.zadd(FeedManager.instance.key(type, receiver.id), status.reblog_of_id, status.reblog_of_id)
  47. else
  48. redis.zremrangebyscore(FeedManager.instance.key(type, receiver.id), status.id, status.id)
  49. end
  50. FeedManager.instance.broadcast(receiver.id, event: 'delete', payload: status.id)
  51. end
  52. def remove_from_hashtags(status)
  53. status.tags.each do |tag|
  54. FeedManager.instance.broadcast("hashtag:#{tag.name}", event: 'delete', payload: status.id)
  55. end
  56. end
  57. def remove_from_public(status)
  58. FeedManager.instance.broadcast(:public, event: 'delete', payload: status.id)
  59. end
  60. def redis
  61. Redis.current
  62. end
  63. end