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
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 83 additions and 4 deletions

View file

@ -1,7 +1,7 @@
version: "2"
plugins:
rubocop:
enabled: true
enabled: false
channel: rubocop-0-73
eslint:
enabled: false

View file

@ -41,7 +41,7 @@
:placeholder="$t('GENERAL_SETTINGS.FORM.DOMAIN.PLACEHOLDER')"
/>
</label>
<label>
<label v-if="featureInboundEmailEnabled">
{{ $t('GENERAL_SETTINGS.FORM.ENABLE_DOMAIN_EMAIL.LABEL') }}
<select v-model="domainEmailsEnabled">
<option value="true">
@ -63,7 +63,7 @@
{{ $t('GENERAL_SETTINGS.FORM.ENABLE_DOMAIN_EMAIL.PLACEHOLDER') }}
</p>
</label>
<label>
<label v-if="featureInboundEmailEnabled">
{{ $t('GENERAL_SETTINGS.FORM.SUPPORT_EMAIL.LABEL') }}
<input
v-model="supportEmail"
@ -102,6 +102,7 @@ export default {
domain: '',
domainEmailsEnabled: false,
supportEmail: '',
features: {},
};
},
validations: {
@ -121,6 +122,10 @@ export default {
isUpdating() {
return this.uiFlags.isUpdating;
},
featureInboundEmailEnabled() {
return !!this.features.inbound_emails;
},
},
mounted() {
if (!this.id) {
@ -141,6 +146,7 @@ export default {
domain,
support_email,
domain_emails_enabled,
features,
} = this.getAccount(accountId);
Vue.config.lang = locale;
@ -150,6 +156,7 @@ export default {
this.domain = domain;
this.supportEmail = support_email;
this.domainEmailsEnabled = domain_emails_enabled;
this.features = features;
}
},

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

View file

@ -4,3 +4,4 @@ json.locale @account.locale
json.domain @account.domain
json.domain_emails_enabled @account.domain_emails_enabled
json.support_email @account.support_email
json.features @account.enabled_features

View file

@ -4,3 +4,4 @@ json.locale @account.locale
json.domain @account.domain
json.domain_emails_enabled @account.domain_emails_enabled
json.support_email @account.support_email
json.features @account.enabled_features

5
config/features.yml Normal file
View file

@ -0,0 +1,5 @@
# DO NOT change the order of features EVER
- name: inbound_emails
enabled: false
- name: test
enabled: false

View 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

View file

@ -10,7 +10,7 @@
#
# 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
enable_extension "pgcrypto"
@ -46,6 +46,7 @@ ActiveRecord::Schema.define(version: 2020_04_29_082655) do
t.string "domain", limit: 100
t.string "support_email", limit: 100
t.integer "settings_flags", default: 0, null: false
t.integer "feature_flags", default: 0, null: false
end
create_table "action_mailbox_inbound_emails", force: :cascade do |t|