about summary refs log tree commit diff
path: root/app/controllers/api/v1/notifications_controller.rb
diff options
context:
space:
mode:
authornicolas <nclm@users.noreply.github.com>2016-11-23 15:43:27 +0100
committerGitHub <noreply@github.com>2016-11-23 15:43:27 +0100
commit23677bc51e657522049fb904e626f81f577de515 (patch)
treedc9417c57a3af3036d621940a751e9adf1b09ce3 /app/controllers/api/v1/notifications_controller.rb
parent1e95fbb10b81ea0eedcb39a83e52f42e3dbb456c (diff)
parent82191b33831f26e071a27dd59ce2e46fb467589c (diff)
Merge branch 'master' into french-translation
Diffstat (limited to 'app/controllers/api/v1/notifications_controller.rb')
-rw-r--r--app/controllers/api/v1/notifications_controller.rb24
1 files changed, 23 insertions, 1 deletions
diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb
index c76189e87..d74b99a86 100644
--- a/app/controllers/api/v1/notifications_controller.rb
+++ b/app/controllers/api/v1/notifications_controller.rb
@@ -7,7 +7,8 @@ class Api::V1::NotificationsController < ApiController
   respond_to :json
 
   def index
-    @notifications = Notification.where(account: current_account).with_includes.paginate_by_max_id(20, params[:max_id], params[:since_id])
+    @notifications = Notification.where(account: current_account).paginate_by_max_id(20, params[:max_id], params[:since_id])
+    @notifications = cache(@notifications)
     statuses       = @notifications.select { |n| !n.target_status.nil? }.map(&:target_status)
 
     set_maps(statuses)
@@ -19,4 +20,25 @@ class Api::V1::NotificationsController < ApiController
 
     set_pagination_headers(next_path, prev_path)
   end
+
+  private
+
+  def cache(raw)
+    uncached_ids           = []
+    cached_keys_with_value = Rails.cache.read_multi(*raw.map(&:cache_key))
+
+    raw.each do |notification|
+      uncached_ids << notification.id unless cached_keys_with_value.key?(notification.cache_key)
+    end
+
+    unless uncached_ids.empty?
+      uncached = Notification.where(id: uncached_ids).with_includes.map { |n| [n.id, n] }.to_h
+
+      uncached.values.each do |notification|
+        Rails.cache.write(notification.cache_key, notification)
+      end
+    end
+
+    raw.map { |notification| cached_keys_with_value[notification.cache_key] || uncached[notification.id] }
+  end
 end