Feature: Feature flags on account (#814) (#815)

* Feature: Feature flags on account (#814)
* Added the new column on account model for managing feature flags
* Added the inbound email flag
* Locked the settings of this eature in account settings based on this
* Encapsulated the feature flaging as a concern. With this, we can re-use the same concern if we introduce this in other models like user or inbox or so.
* Added the features in the account api

* Changed Rails/FilePath style - rubocop issue

* Revert "Changed Rails/FilePath style - rubocop issue"

This reverts commit 3a42d3b9c9b3a2fde8bc7256fd704b6fcaf54040.

* Disabling rubocop on codeclimate as we already have this in CICD
This commit is contained in:
Sony Mathew
2020-05-04 23:06:42 +05:30
committed by GitHub
parent 98af47aae2
commit fabc3170b7
9 changed files with 83 additions and 4 deletions

View File

@@ -4,6 +4,7 @@
#
# id :integer not null, primary key
# domain :string(100)
# feature_flags :integer default(0), not null
# locale :integer default("en")
# name :string not null
# settings_flags :integer default(0), not null
@@ -18,6 +19,7 @@ class Account < ApplicationRecord
include Events::Types
include Reportable
include Features
DEFAULT_QUERY_SETTING = {
flag_query_mode: :bit_operator

View File

@@ -0,0 +1,57 @@
module Features
extend ActiveSupport::Concern
QUERY_MODE = {
flag_query_mode: :bit_operator
}.freeze
FEATURE_LIST = YAML.safe_load(File.read(Rails.root.join('config/features.yml'))).freeze
FEATURES = FEATURE_LIST.each_with_object({}) do |feature, result|
result[result.keys.size + 1] = "feature_#{feature['name']}".to_sym
end
included do
include FlagShihTzu
has_flags FEATURES.merge(column: 'feature_flags').merge(QUERY_MODE)
before_create :enable_default_features
end
def enable_features(names)
names.each do |name|
send("feature_#{name}=", true)
end
end
def disable_features(names)
names.each do |name|
send("feature_#{name}=", false)
end
end
def feature_enabled?(name)
send("feature_#{name}?")
end
def all_features
FEATURE_LIST.map { |f| f['name'] }.index_with do |feature_name|
feature_enabled?(feature_name)
end
end
def enabled_features
all_features.select { |_feature, enabled| enabled == true }
end
def disabled_features
all_features.select { |_feature, enabled| enabled == false }
end
private
def enable_default_features
features_to_enabled = FEATURE_LIST.select { |f| f['enabled'] }.map { |f| f['name'] }
enable_features(features_to_enabled)
end
end