Add flipflop config
This commit is contained in:
parent
6b9003c3f4
commit
3f3358db16
4 changed files with 79 additions and 6 deletions
44
app/lib/flipflop/strategies/user_preference_strategy.rb
Normal file
44
app/lib/flipflop/strategies/user_preference_strategy.rb
Normal file
|
@ -0,0 +1,44 @@
|
|||
module Flipflop::Strategies
|
||||
class UserPreferenceStrategy < AbstractStrategy
|
||||
def self.default_description
|
||||
"Allows configuration of features per user."
|
||||
end
|
||||
|
||||
def switchable?
|
||||
false
|
||||
end
|
||||
|
||||
def enabled?(feature)
|
||||
# Can only check features if we have the user's session.
|
||||
if request?
|
||||
legacy_enabled?(feature) || find_current_administrateur&.feature_enabled?(feature)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def legacy_enabled?(feature)
|
||||
if self.class.legacy_features_map.present?
|
||||
ids = self.class.legacy_features_map["#{feature}_allowed_for_admin_ids"]
|
||||
ids.present? && find_current_administrateur&.id&.in?(ids)
|
||||
end
|
||||
end
|
||||
|
||||
LEGACY_CONFIG_FILE = Rails.root.join("config", "initializers", "features.yml")
|
||||
|
||||
def self.legacy_features_map
|
||||
@@legacy_features_map = begin
|
||||
if File.exist?(LEGACY_CONFIG_FILE)
|
||||
YAML.load_file(LEGACY_CONFIG_FILE)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def find_current_administrateur
|
||||
if request.session["warden.user.user.key"]
|
||||
administrateur_id = request.session["warden.user.user.key"][0][0]
|
||||
Administrateur.find_by(id: administrateur_id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -74,8 +74,20 @@ class Administrateur < ApplicationRecord
|
|||
end
|
||||
|
||||
def feature_enabled?(feature)
|
||||
ids = Features.send(:"#{feature}_for_admin_ids")
|
||||
ids.present? ? id.in?(ids) : false
|
||||
Flipflop.feature_set.feature(feature)
|
||||
features[feature.to_s]
|
||||
end
|
||||
|
||||
def disable_feature(feature)
|
||||
Flipflop.feature_set.feature(feature)
|
||||
features.delete(feature.to_s)
|
||||
save
|
||||
end
|
||||
|
||||
def enable_feature(feature)
|
||||
Flipflop.feature_set.feature(feature)
|
||||
features[feature.to_s] = true
|
||||
save
|
||||
end
|
||||
|
||||
private
|
||||
|
|
18
config/features.rb
Normal file
18
config/features.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
Flipflop.configure do
|
||||
strategy :cookie
|
||||
strategy :active_record
|
||||
strategy :user_preference
|
||||
strategy :default
|
||||
|
||||
group :champs do
|
||||
feature :champ_pj
|
||||
feature :champ_siret
|
||||
end
|
||||
feature :web_hook
|
||||
group :production do
|
||||
feature :remote_storage,
|
||||
default: Rails.env.production? || Rails.env.staging?
|
||||
feature :weekly_overview,
|
||||
default: Rails.env.production? || Rails.env.staging?
|
||||
end
|
||||
end
|
|
@ -71,11 +71,10 @@ describe Administrateur, type: :model do
|
|||
let(:administrateur) { create(:administrateur) }
|
||||
|
||||
before do
|
||||
allow(Features).to receive(:champ_pj_allowed_for_admin_ids)
|
||||
.and_return([administrateur.id])
|
||||
administrateur.enable_feature(:champ_pj)
|
||||
end
|
||||
|
||||
it { expect(administrateur.feature_enabled?(:yolo)).to be_falsey }
|
||||
it { expect(administrateur.feature_enabled?(:champ_pj_allowed)).to be_truthy }
|
||||
it { expect(administrateur.feature_enabled?(:champ_siret)).to be_falsey }
|
||||
it { expect(administrateur.feature_enabled?(:champ_pj)).to be_truthy }
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue