* 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:
parent
98af47aae2
commit
fabc3170b7
9 changed files with 83 additions and 4 deletions
|
@ -1,7 +1,7 @@
|
||||||
version: "2"
|
version: "2"
|
||||||
plugins:
|
plugins:
|
||||||
rubocop:
|
rubocop:
|
||||||
enabled: true
|
enabled: false
|
||||||
channel: rubocop-0-73
|
channel: rubocop-0-73
|
||||||
eslint:
|
eslint:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
:placeholder="$t('GENERAL_SETTINGS.FORM.DOMAIN.PLACEHOLDER')"
|
:placeholder="$t('GENERAL_SETTINGS.FORM.DOMAIN.PLACEHOLDER')"
|
||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label v-if="featureInboundEmailEnabled">
|
||||||
{{ $t('GENERAL_SETTINGS.FORM.ENABLE_DOMAIN_EMAIL.LABEL') }}
|
{{ $t('GENERAL_SETTINGS.FORM.ENABLE_DOMAIN_EMAIL.LABEL') }}
|
||||||
<select v-model="domainEmailsEnabled">
|
<select v-model="domainEmailsEnabled">
|
||||||
<option value="true">
|
<option value="true">
|
||||||
|
@ -63,7 +63,7 @@
|
||||||
{{ $t('GENERAL_SETTINGS.FORM.ENABLE_DOMAIN_EMAIL.PLACEHOLDER') }}
|
{{ $t('GENERAL_SETTINGS.FORM.ENABLE_DOMAIN_EMAIL.PLACEHOLDER') }}
|
||||||
</p>
|
</p>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label v-if="featureInboundEmailEnabled">
|
||||||
{{ $t('GENERAL_SETTINGS.FORM.SUPPORT_EMAIL.LABEL') }}
|
{{ $t('GENERAL_SETTINGS.FORM.SUPPORT_EMAIL.LABEL') }}
|
||||||
<input
|
<input
|
||||||
v-model="supportEmail"
|
v-model="supportEmail"
|
||||||
|
@ -102,6 +102,7 @@ export default {
|
||||||
domain: '',
|
domain: '',
|
||||||
domainEmailsEnabled: false,
|
domainEmailsEnabled: false,
|
||||||
supportEmail: '',
|
supportEmail: '',
|
||||||
|
features: {},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
validations: {
|
validations: {
|
||||||
|
@ -121,6 +122,10 @@ export default {
|
||||||
isUpdating() {
|
isUpdating() {
|
||||||
return this.uiFlags.isUpdating;
|
return this.uiFlags.isUpdating;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
featureInboundEmailEnabled() {
|
||||||
|
return !!this.features.inbound_emails;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
if (!this.id) {
|
if (!this.id) {
|
||||||
|
@ -141,6 +146,7 @@ export default {
|
||||||
domain,
|
domain,
|
||||||
support_email,
|
support_email,
|
||||||
domain_emails_enabled,
|
domain_emails_enabled,
|
||||||
|
features,
|
||||||
} = this.getAccount(accountId);
|
} = this.getAccount(accountId);
|
||||||
|
|
||||||
Vue.config.lang = locale;
|
Vue.config.lang = locale;
|
||||||
|
@ -150,6 +156,7 @@ export default {
|
||||||
this.domain = domain;
|
this.domain = domain;
|
||||||
this.supportEmail = support_email;
|
this.supportEmail = support_email;
|
||||||
this.domainEmailsEnabled = domain_emails_enabled;
|
this.domainEmailsEnabled = domain_emails_enabled;
|
||||||
|
this.features = features;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#
|
#
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# domain :string(100)
|
# domain :string(100)
|
||||||
|
# feature_flags :integer default(0), not null
|
||||||
# locale :integer default("en")
|
# locale :integer default("en")
|
||||||
# name :string not null
|
# name :string not null
|
||||||
# settings_flags :integer default(0), not null
|
# settings_flags :integer default(0), not null
|
||||||
|
@ -18,6 +19,7 @@ class Account < ApplicationRecord
|
||||||
|
|
||||||
include Events::Types
|
include Events::Types
|
||||||
include Reportable
|
include Reportable
|
||||||
|
include Features
|
||||||
|
|
||||||
DEFAULT_QUERY_SETTING = {
|
DEFAULT_QUERY_SETTING = {
|
||||||
flag_query_mode: :bit_operator
|
flag_query_mode: :bit_operator
|
||||||
|
|
57
app/models/concerns/features.rb
Normal file
57
app/models/concerns/features.rb
Normal 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
|
|
@ -4,3 +4,4 @@ json.locale @account.locale
|
||||||
json.domain @account.domain
|
json.domain @account.domain
|
||||||
json.domain_emails_enabled @account.domain_emails_enabled
|
json.domain_emails_enabled @account.domain_emails_enabled
|
||||||
json.support_email @account.support_email
|
json.support_email @account.support_email
|
||||||
|
json.features @account.enabled_features
|
||||||
|
|
|
@ -4,3 +4,4 @@ json.locale @account.locale
|
||||||
json.domain @account.domain
|
json.domain @account.domain
|
||||||
json.domain_emails_enabled @account.domain_emails_enabled
|
json.domain_emails_enabled @account.domain_emails_enabled
|
||||||
json.support_email @account.support_email
|
json.support_email @account.support_email
|
||||||
|
json.features @account.enabled_features
|
||||||
|
|
5
config/features.yml
Normal file
5
config/features.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# DO NOT change the order of features EVER
|
||||||
|
- name: inbound_emails
|
||||||
|
enabled: false
|
||||||
|
- name: test
|
||||||
|
enabled: false
|
5
db/migrate/20200503151130_add_account_feature_flag.rb
Normal file
5
db/migrate/20200503151130_add_account_feature_flag.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
class AddAccountFeatureFlag < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
add_column :accounts, :feature_flags, :integer, index: true, default: 0, null: false
|
||||||
|
end
|
||||||
|
end
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 2020_04_29_082655) do
|
ActiveRecord::Schema.define(version: 2020_05_03_151130) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "pgcrypto"
|
enable_extension "pgcrypto"
|
||||||
|
@ -46,6 +46,7 @@ ActiveRecord::Schema.define(version: 2020_04_29_082655) do
|
||||||
t.string "domain", limit: 100
|
t.string "domain", limit: 100
|
||||||
t.string "support_email", limit: 100
|
t.string "support_email", limit: 100
|
||||||
t.integer "settings_flags", default: 0, null: false
|
t.integer "settings_flags", default: 0, null: false
|
||||||
|
t.integer "feature_flags", default: 0, null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "action_mailbox_inbound_emails", force: :cascade do |t|
|
create_table "action_mailbox_inbound_emails", force: :cascade do |t|
|
||||||
|
|
Loading…
Reference in a new issue