about summary refs log tree commit diff
path: root/app/lib/activity_tracker.rb
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2021-10-14 20:44:59 +0200
committerGitHub <noreply@github.com>2021-10-14 20:44:59 +0200
commit07341e7aa60fe7c7d4f298136af99276820940e7 (patch)
tree0244c21262573d6a94868f8ce7dfa934fabccf1e /app/lib/activity_tracker.rb
parent959f7fc580050b37741c92b645b842e45017a010 (diff)
Add graphs and retention metrics to admin dashboard (#16829)
Diffstat (limited to 'app/lib/activity_tracker.rb')
-rw-r--r--app/lib/activity_tracker.rb70
1 files changed, 57 insertions, 13 deletions
diff --git a/app/lib/activity_tracker.rb b/app/lib/activity_tracker.rb
index 81303b715..6d3401b37 100644
--- a/app/lib/activity_tracker.rb
+++ b/app/lib/activity_tracker.rb
@@ -1,29 +1,73 @@
 # frozen_string_literal: true
 
 class ActivityTracker
+  include Redisable
+
   EXPIRE_AFTER = 6.months.seconds
 
-  class << self
-    include Redisable
+  def initialize(prefix, type)
+    @prefix = prefix
+    @type   = type
+  end
 
-    def increment(prefix)
-      key = [prefix, current_week].join(':')
+  def add(value = 1, at_time = Time.now.utc)
+    key = key_at(at_time)
 
-      redis.incrby(key, 1)
-      redis.expire(key, EXPIRE_AFTER)
+    case @type
+    when :basic
+      redis.incrby(key, value)
+    when :unique
+      redis.pfadd(key, value)
     end
 
-    def record(prefix, value)
-      key = [prefix, current_week].join(':')
+    redis.expire(key, EXPIRE_AFTER)
+  end
 
-      redis.pfadd(key, value)
-      redis.expire(key, EXPIRE_AFTER)
+  def get(start_at, end_at = Time.now.utc)
+    (start_at.to_date...end_at.to_date).map do |date|
+      key = key_at(date.to_time(:utc))
+
+      value = begin
+        case @type
+        when :basic
+          redis.get(key).to_i
+        when :unique
+          redis.pfcount(key)
+        end
+      end
+
+      [date, value]
+    end
+  end
+
+  def sum(start_at, end_at = Time.now.utc)
+    keys = (start_at.to_date...end_at.to_date).flat_map { |date| [key_at(date.to_time(:utc)), legacy_key_at(date)] }.uniq
+
+    case @type
+    when :basic
+      redis.mget(*keys).map(&:to_i).sum
+    when :unique
+      redis.pfcount(*keys)
     end
+  end
 
-    private
+  class << self
+    def increment(prefix)
+      new(prefix, :basic).add
+    end
 
-    def current_week
-      Time.zone.today.cweek
+    def record(prefix, value)
+      new(prefix, :unique).add(value)
     end
   end
+
+  private
+
+  def key_at(at_time)
+    "#{@prefix}:#{at_time.beginning_of_day.to_i}"
+  end
+
+  def legacy_key_at(at_time)
+    "#{@prefix}:#{at_time.to_date.cweek}"
+  end
 end