diff --git a/app/controllers/admin/debates_controller.rb b/app/controllers/admin/debates_controller.rb index 2bb0cb8fd..0b0b31b8b 100644 --- a/app/controllers/admin/debates_controller.rb +++ b/app/controllers/admin/debates_controller.rb @@ -1,4 +1,8 @@ class Admin::DebatesController < Admin::BaseController + include FeatureFlags + + feature_flag :debates + has_filters %w{without_confirmed_hide all with_confirmed_hide}, only: :index before_action :load_debate, only: [:confirm_hide, :restore] diff --git a/app/controllers/concerns/feature_flags.rb b/app/controllers/concerns/feature_flags.rb new file mode 100644 index 000000000..9c96db96e --- /dev/null +++ b/app/controllers/concerns/feature_flags.rb @@ -0,0 +1,25 @@ +module FeatureFlags + extend ActiveSupport::Concern + + class_methods do + def feature_flag(name, *options) + before_filter(*options) do + check_feature_flag(name) + end + end + end + + def check_feature_flag(name) + raise FeatureDisabled, name unless Setting["feature.#{name}"] + end + + class FeatureDisabled < Exception + def initialize(name) + @name = name + end + + def message + "Feature disabled: #{@name}" + end + end +end diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index 824118c8d..086403e1b 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -1,4 +1,5 @@ class DebatesController < ApplicationController + include FeatureFlags include CommentableActions include FlagActions @@ -7,6 +8,8 @@ class DebatesController < ApplicationController before_action :set_search_order, only: :index before_action :authenticate_user!, except: [:index, :show] + feature_flag :debates + has_orders %w{hot_score confidence_score created_at relevance}, only: :index has_orders %w{most_voted newest oldest}, only: :show diff --git a/app/controllers/moderation/debates_controller.rb b/app/controllers/moderation/debates_controller.rb index e2a6ba2a0..aaa3d9f89 100644 --- a/app/controllers/moderation/debates_controller.rb +++ b/app/controllers/moderation/debates_controller.rb @@ -1,9 +1,12 @@ class Moderation::DebatesController < Moderation::BaseController include ModerateActions + include FeatureFlags has_filters %w{pending_flag_review all with_ignored_flag}, only: :index has_orders %w{flags created_at}, only: :index + feature_flag :debates + before_action :load_resources, only: [:index, :moderate] load_and_authorize_resource diff --git a/app/helpers/feature_flags_helper.rb b/app/helpers/feature_flags_helper.rb new file mode 100644 index 000000000..1e74c016b --- /dev/null +++ b/app/helpers/feature_flags_helper.rb @@ -0,0 +1,5 @@ +module FeatureFlagsHelper + def feature?(name) + !!Setting["feature.#{name}"] + end +end diff --git a/app/models/setting.rb b/app/models/setting.rb index 9cf6fa3a2..b8b29a645 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -11,6 +11,7 @@ class Setting < ActiveRecord::Base def []=(key, value) setting = where(key: key).first || new(key: key) setting.value = value + setting.value = nil if setting.value == false setting.save! value end diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb index b075755da..495ec3647 100644 --- a/app/views/admin/_menu.html.erb +++ b/app/views/admin/_menu.html.erb @@ -18,12 +18,14 @@ <% end %> -
  • > - <%= link_to admin_debates_path do %> - - <%= t("admin.menu.hidden_debates") %> - <% end %> -
  • + <% if feature?(:debates) %> +
  • > + <%= link_to admin_debates_path do %> + + <%= t("admin.menu.hidden_debates") %> + <% end %> +
  • + <% end %>
  • > <%= link_to admin_comments_path do %> diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 75e41c192..467007958 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -35,7 +35,9 @@
  • -
  • > - <%= link_to moderation_debates_path do %> - - <%= t('moderation.menu.flagged_debates') %> - <% end %> -
  • + <% if feature?(:debates) %> +
  • > + <%= link_to moderation_debates_path do %> + + <%= t('moderation.menu.flagged_debates') %> + <% end %> +
  • + <% end %>
  • > <%= link_to moderation_comments_path do %> diff --git a/app/views/users/_activity_page.html.erb b/app/views/users/_activity_page.html.erb index 296f7e5c2..e90b8ce93 100644 --- a/app/views/users/_activity_page.html.erb +++ b/app/views/users/_activity_page.html.erb @@ -1,3 +1,3 @@ <%= render "proposals" if @proposals.present? %> -<%= render "debates" if @debates.present? %> +<%= render "debates" if @debates.present? && feature?(:debates) %> <%= render "comments" if @comments.present? %> diff --git a/db/seeds.rb b/db/seeds.rb index c8c0351de..82cb4c67a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -49,3 +49,6 @@ Setting["org_name"] = "Consul" # Consul installation place name (City, Country...) Setting["place_name"] = "Consul-land" + +# Feature flags +Setting['feature.debates'] = true diff --git a/spec/features/admin/debates_spec.rb b/spec/features/admin/debates_spec.rb index f529b4a8f..43d12b081 100644 --- a/spec/features/admin/debates_spec.rb +++ b/spec/features/admin/debates_spec.rb @@ -2,6 +2,14 @@ require 'rails_helper' feature 'Admin debates' do + scenario 'Disabled with a feature flag' do + Setting['feature.debates'] = nil + admin = create(:administrator) + login_as(admin.user) + + expect{ visit admin_debates_path }.to raise_exception(FeatureFlags::FeatureDisabled) + end + background do admin = create(:administrator) login_as(admin.user) diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index db3e721b4..5876c3089 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -3,6 +3,11 @@ require 'rails_helper' feature 'Debates' do + scenario 'Disabled with a feature flag' do + Setting['feature.debates'] = nil + expect{ visit debates_path }.to raise_exception(FeatureFlags::FeatureDisabled) + end + scenario 'Index' do debates = [create(:debate), create(:debate), create(:debate)] diff --git a/spec/features/moderation/debates_spec.rb b/spec/features/moderation/debates_spec.rb index 1f68ee80a..87a8b4d7d 100644 --- a/spec/features/moderation/debates_spec.rb +++ b/spec/features/moderation/debates_spec.rb @@ -2,6 +2,14 @@ require 'rails_helper' feature 'Moderate debates' do + scenario 'Disabled with a feature flag' do + Setting['feature.debates'] = nil + moderator = create(:moderator) + login_as(moderator.user) + + expect{ visit moderation_debates_path }.to raise_exception(FeatureFlags::FeatureDisabled) + end + scenario 'Hide', :js do citizen = create(:user) moderator = create(:moderator)