about summary refs log tree commit diff
path: root/app/services
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-09-05 01:59:46 +0200
committerEugen Rochko <eugen@zeonfederated.com>2016-09-05 01:59:46 +0200
commit926eea89b51196821d49c7216f38faf0aedb4b09 (patch)
treeb0d44dffa1ed95451c95d75b6c884edf9c0dd049 /app/services
parent413e700fe027ed7a4fdac325a9369d1481d52458 (diff)
RemoveStatusService fleshed out, still doesn't send Salmon slaps though
Diffstat (limited to 'app/services')
-rw-r--r--app/services/fan_out_on_write_service.rb2
-rw-r--r--app/services/remove_status_service.rb50
2 files changed, 48 insertions, 4 deletions
diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb
index 6e96fa75b..d51681e53 100644
--- a/app/services/fan_out_on_write_service.rb
+++ b/app/services/fan_out_on_write_service.rb
@@ -31,7 +31,7 @@ class FanOutOnWriteService < BaseService
   def push(type, receiver, status)
     redis.zadd(FeedManager.key(type, receiver.id), status.id, status.id)
     trim(type, receiver)
-    ActionCable.server.broadcast("timeline:#{receiver.id}", timeline: type, message: inline_render(receiver, status))
+    ActionCable.server.broadcast("timeline:#{receiver.id}", type: 'update', timeline: type, message: inline_render(receiver, status))
   end
 
   def trim(type, receiver)
diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb
index 1b5da6b2a..db043df08 100644
--- a/app/services/remove_status_service.rb
+++ b/app/services/remove_status_service.rb
@@ -1,10 +1,54 @@
 class RemoveStatusService < BaseService
   def call(status)
+    remove_from_self(status) if status.account.local?
+    remove_from_followers(status)
+    remove_from_mentioned(status)
+    remove_reblogs(status)
+
     status.destroy!
+  end
+
+  private
+
+  def remove_from_self(status)
+    unpush(:home, status.account, status)
+  end
+
+  def remove_from_followers(status)
+    status.account.followers.each do |follower|
+      next unless follower.local?
+      unpush(:home, follower, status)
+    end
+  end
+
+  def remove_from_mentioned(status)
+    status.mentions.each do |mention|
+      mentioned_account = mention.account
 
+      if mentioned_account.local?
+        unpush(:mentions, mentioned_account, status)
+      else
+        send_delete_salmon(mentioned_account, status)
+      end
+    end
+  end
+
+  def send_delete_salmon(account, status)
     # TODO
-    # Remove from timelines of self, followers, and mentioned accounts
-    # For remote mentioned accounts, send delete Salmon
-    # Push delete event through ActionCable
+  end
+
+  def remove_reblogs(status)
+    status.reblogs.each do |reblog|
+      RemoveStatusService.new.(reblog)
+    end
+  end
+
+  def unpush(type, receiver, status)
+    redis.zremrangebyscore(FeedManager.key(type, receiver.id), status.id, status.id)
+    ActionCable.server.broadcast("timeline:#{receiver.id}", type: 'delete', id: status.id)
+  end
+
+  def redis
+    $redis
   end
 end