diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb index dd2f97ba2c..42cee7e0d6 100644 --- a/config/initializers/flipper.rb +++ b/config/initializers/flipper.rb @@ -1,11 +1,28 @@ require "flipper" require "flipper/adapters/active_record" +require "open_food_network/feature_toggle" -if Rails.env.production? - Flipper::UI.configure do |config| - config.banner_text = '⚠️ Production environment: be aware that the changes have an impact on the application. Please, read the how-to before: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Feature-toggle-with-Flipper' +Flipper.register(:admins) { |actor| actor.respond_to?(:admin?) && actor.admin? } + +Flipper::UI.configure do |config| + config.descriptions_source = ->(_keys) do + # return has to be hash of {String key => String description} + OpenFoodNetwork::FeatureToggle::CURRENT_FEATURES + end + + # Defaults to false. Set to true to show feature descriptions on the list + # page as well as the view page. + # config.show_feature_description_in_list = true + + if Rails.env.production? + config.banner_text = <<~TEXT + ⚠️ Production environment: be aware that the changes have an impact on the + application. Please read the how-to before: + https://github.com/openfoodfoundation/openfoodnetwork/wiki/Feature-toggle-with-Flipper + TEXT config.banner_class = 'danger' end end -Flipper.register(:admins) { |actor| actor.respond_to?(:admin?) && actor.admin? } +# Add known feature toggles. This may fail if the database isn't setup yet. +OpenFoodNetwork::FeatureToggle.setup! rescue ActiveRecord::StatementInvalid diff --git a/lib/open_food_network/feature_toggle.rb b/lib/open_food_network/feature_toggle.rb index 888342fab3..e0b8e49451 100644 --- a/lib/open_food_network/feature_toggle.rb +++ b/lib/open_food_network/feature_toggle.rb @@ -7,10 +7,60 @@ module OpenFoodNetwork # - http://localhost:3000/admin/feature-toggle/features # module FeatureToggle + # Please add your new feature here to appear in the Flipper UI. + # We way move this to a YAML file when it becomes too awkward. + CURRENT_FEATURES = { + "admin_style_v2" => <<~DESC, + Change some colour and layout in the backend to a newer version. + DESC + "api_reports" => <<~DESC, + An API endpoint for reports at + /api/v0/reports/:report_type(/:report_subtype) + DESC + "api_v1" => <<~DESC, + Enable the new API at /api/v1 + DESC + "background_reports" => <<~DESC, + Generate reports in a background process to limit memory consumption. + DESC + "dfc_provider" => <<~DESC, + Enable the DFC compatible endpoint at /api/dfc-*. + DESC + "match_shipping_categories" => <<~DESC, + During checkout, show only shipping methods that support all + shipping categories. Activating this feature for an enterprise owner + will activate it for all shops of this enterprise. + DESC + "new_products_page" => <<~DESC, + Show the new (experimental) version of the admin products page. + DESC + "split_checkout" => <<~DESC, + Replace the one-page checkout with a multi-step checkout. + DESC + }.freeze + + # Move your feature entry from CURRENT_FEATURES to RETIRED_FEATURES when + # you remove it from the code. It will then be deleted from the database. + # + # We may delete this field one day and regard all features not listed in + # CURRENT_FEATURES as unsupported and remove them. But until this approach + # is accepted we delete only the features listed here. + RETIRED_FEATURES = {}.freeze + + def self.setup! + CURRENT_FEATURES.each_key do |name| + feature = Flipper.feature(name) + feature.add unless feature.exist? + end + + RETIRED_FEATURES.each_key do |name| + feature = Flipper.feature(name) + feature.remove if feature.exist? + end + end + def self.enabled?(feature_name, user = nil) - feature = Flipper.feature(feature_name) - feature.add unless feature.exist? - feature.enabled?(user) + Flipper.enabled?(feature_name, user) end def self.disabled?(feature_name, user = nil) diff --git a/spec/lib/open_food_network/feature_toggle_spec.rb b/spec/lib/open_food_network/feature_toggle_spec.rb index ce18fb5bba..97e41108a6 100644 --- a/spec/lib/open_food_network/feature_toggle_spec.rb +++ b/spec/lib/open_food_network/feature_toggle_spec.rb @@ -13,13 +13,6 @@ module OpenFoodNetwork Flipper.enable(:foo) expect(FeatureToggle.enabled?(:foo)).to be true end - - it "adds features to the database for easy admin in the UI" do - feature = Flipper.feature(:sparkling_new) - - expect { FeatureToggle.enabled?(:sparkling_new) }. - to change { feature.exist? }.from(false).to(true) - end end end end