about summary refs log tree commit diff
path: root/app/services/precompute_feed_service.rb
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-03-25 02:13:30 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-03-25 02:13:30 +0100
commita08e724476f47b85de9bb334eeadaf882a7a23ee (patch)
treed779668fa289d2b7077c878b19fc6691a57142b7 /app/services/precompute_feed_service.rb
parent9594f0e858172b9295c5598fcb6ab10506d3046d (diff)
Fix subscriptions:clear task, refactor feeds, refactor streamable activites
and atom feed generation to some extent, as well as the way mentions are
stored
Diffstat (limited to 'app/services/precompute_feed_service.rb')
-rw-r--r--app/services/precompute_feed_service.rb32
1 files changed, 10 insertions, 22 deletions
diff --git a/app/services/precompute_feed_service.rb b/app/services/precompute_feed_service.rb
index 9d3b8d370..de4201a8f 100644
--- a/app/services/precompute_feed_service.rb
+++ b/app/services/precompute_feed_service.rb
@@ -1,33 +1,21 @@
 class PrecomputeFeedService < BaseService
-  MAX_FEED_SIZE = 800
-
-  # Fill up a user's home/mentions feed from DB and return it
+  # Fill up a user's home/mentions feed from DB and return a subset
   # @param [Symbol] type :home or :mentions
   # @param [Account] account
   # @return [Array]
-  def call(type, account)
-    statuses = send(type.to_s, account).order('created_at desc').limit(MAX_FEED_SIZE)
-    statuses.each { |status| push(type, account.id, status) }
-    statuses
-  end
+  def call(type, account, limit)
+    instant_return = []
 
-  private
-
-  def push(type, receiver_id, status)
-    redis.zadd(key(type, receiver_id), status.id, status.id)
-  end
+    Status.send("as_#{type}_timeline", account).order('created_at desc').limit(FeedManager::MAX_ITEMS).each do |status|
+      next if type == :home && FeedManager.filter_status?(status, account)
+      redis.zadd(FeedManager.key(type, receiver_id), status.id, status.id)
+      instant_return << status unless instant_return.size > limit
+    end
 
-  def home(account)
-    Status.where(account: [account] + account.following).with_includes.with_counters
+    instant_return
   end
 
-  def mentions(account)
-    Status.where(id: Mention.where(account: account).pluck(:status_id)).with_includes.with_counters
-  end
-
-  def key(type, id)
-    "feed:#{type}:#{id}"
-  end
+  private
 
   def redis
     $redis