diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb index dd2f97ba2c..69a013f25f 100644 --- a/config/initializers/flipper.rb +++ b/config/initializers/flipper.rb @@ -1,5 +1,6 @@ require "flipper" require "flipper/adapters/active_record" +require "open_food_network/feature_toggle" if Rails.env.production? Flipper::UI.configure do |config| @@ -9,3 +10,17 @@ if Rails.env.production? end 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 +end + +# 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..981155e5d6 100644 --- a/lib/open_food_network/feature_toggle.rb +++ b/lib/open_food_network/feature_toggle.rb @@ -7,6 +7,58 @@ 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?