From 845642ac46a368334e00d3f9fb7000abbbbaf7c5 Mon Sep 17 00:00:00 2001
From: Alan Guo Xiang Tan <gxtan1990@gmail.com>
Date: Thu, 14 Jul 2022 14:30:46 +0800
Subject: [PATCH] DEV: Add per-user feature flag for the new notifications menu
 (#17490)

Co-authored-by: OsamaSayegh <asooomaasoooma90@gmail.com>
---
 app/models/user.rb                         | 20 ++++++++++++++++++++
 app/serializers/current_user_serializer.rb | 10 +++++++++-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/app/models/user.rb b/app/models/user.rb
index 76d7873bc76..f46907f0a24 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1564,6 +1564,26 @@ class User < ActiveRecord::Base
     user_status && !user_status.expired?
   end
 
+  REDESIGN_USER_MENU_REDIS_KEY_PREFIX = "redesigned_user_menu_for_user_"
+
+  def self.redesigned_user_menu_enabled_user_ids
+    Discourse.redis.scan_each(match: "#{REDESIGN_USER_MENU_REDIS_KEY_PREFIX}*").map do |key|
+      key.sub(REDESIGN_USER_MENU_REDIS_KEY_PREFIX, "").to_i
+    end
+  end
+
+  def redesigned_user_menu_enabled?
+    Discourse.redis.get("#{REDESIGN_USER_MENU_REDIS_KEY_PREFIX}#{self.id}") == "1"
+  end
+
+  def enable_redesigned_user_menu
+    Discourse.redis.setex("#{REDESIGN_USER_MENU_REDIS_KEY_PREFIX}#{self.id}", 6.months, "1")
+  end
+
+  def disable_redesigned_user_menu
+    Discourse.redis.del("#{REDESIGN_USER_MENU_REDIS_KEY_PREFIX}#{self.id}")
+  end
+
   protected
 
   def badge_grant
diff --git a/app/serializers/current_user_serializer.rb b/app/serializers/current_user_serializer.rb
index fed12820413..0625e336cf2 100644
--- a/app/serializers/current_user_serializer.rb
+++ b/app/serializers/current_user_serializer.rb
@@ -74,7 +74,8 @@ class CurrentUserSerializer < BasicUserSerializer
              :experimental_sidebar_enabled,
              :status,
              :sidebar_category_ids,
-             :sidebar_tag_names
+             :sidebar_tag_names,
+             :redesigned_user_menu_enabled
 
   delegate :user_stat, to: :object, private: true
   delegate :any_posts, :draft_count, :pending_posts_count, :read_faq?, to: :user_stat
@@ -338,4 +339,11 @@ class CurrentUserSerializer < BasicUserSerializer
   def status
     UserStatusSerializer.new(object.user_status, root: false)
   end
+
+  def redesigned_user_menu_enabled
+    if defined?(@redesigned_user_menu_enabled)
+      return @redesigned_user_menu_enabled
+    end
+    @redesigned_user_menu_enabled = object.redesigned_user_menu_enabled?
+  end
 end