about summary refs log tree commit diff
path: root/app/controllers/api/v1/notifications_controller.rb
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-11-23 09:20:34 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-11-23 09:20:34 +0100
commit4bdb6a0eaffb39fb953689729c9fcf772c7128d6 (patch)
treefcd98ede617616ad46cab322735dcd9512e4f08c /app/controllers/api/v1/notifications_controller.rb
parent9b53c7d353477e21ce5f3c6b56beb853cc1c0ef2 (diff)
Rename "publish" to "toot" in english locale, fix lightbox showing old image
before loading new one, cache notifications API, fix missing follow button
on public profiles
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