docbrown/app/controllers/admin/configs_controller.rb
Alexis Moody f4a10e4a44
[deploy] Adds a new admin setting for experience levels. (#10870)
* Adds a new admin setting for experience levels.

This is used in the post management UI to determine the range of experience. These values fallback to the ones we currently see in DEV, Total Newbies and Senior Devs. There is also a removal of the word coding when talking about experience level, since the context for each forem instance should be implied when referencing experience.

* Cleans up experience defaults

* Fixes instance_of usage
2020-10-16 12:40:25 -06:00

233 lines
6.7 KiB
Ruby

module Admin
class ConfigsController < Admin::ApplicationController
CAMPAIGN_PARAMS =
%i[
campaign_featured_tags
campaign_hero_html_variant_name
campaign_sidebar_enabled
campaign_sidebar_image
campaign_url
campaign_articles_require_approval
].freeze
COMMUNITY_PARAMS =
%i[
community_name
community_description
community_member_label
community_copyright_start_year
staff_user_id
tagline
experience_low
experience_high
].freeze
NEWSLETTER_PARAMS =
%i[
mailchimp_api_key
mailchimp_community_moderators_id
mailchimp_newsletter_id
mailchimp_sustaining_members_id
mailchimp_tag_moderators_id
].freeze
RATE_LIMIT_PARAMS =
%i[
rate_limit_comment_creation
rate_limit_email_recipient
rate_limit_follow_count_daily
rate_limit_image_upload
rate_limit_published_article_creation
rate_limit_published_article_antispam_creation
rate_limit_organization_creation
rate_limit_user_subscription_creation
rate_limit_article_update
rate_limit_user_update
rate_limit_feedback_message_creation
rate_limit_listing_creation
rate_limit_reaction_creation
rate_limit_send_email_confirmation
].freeze
MASCOT_PARAMS =
%i[
mascot_image_description
mascot_image_url
mascot_footer_image_url
mascot_footer_image_width
mascot_footer_image_height
mascot_user_id
].freeze
IMAGE_PARAMS =
%i[
favicon_url
logo_png
logo_svg
main_social_image
secondary_logo_url
left_navbar_svg_icon
right_navbar_svg_icon
].freeze
ONBOARDING_PARAMS =
%i[
onboarding_logo_image
onboarding_background_image
onboarding_taskcard_image
suggested_tags
suggested_users
].freeze
JOB_PARAMS =
%i[
jobs_url
display_jobs_banner
].freeze
ALLOWED_EMPTY_ENUMERABLES =
%i[
authentication_providers
].freeze
ALLOWED_PARAMS =
%i[
ga_tracking_id
periodic_email_digest_max
periodic_email_digest_min
sidebar_tags
twitter_hashtag
shop_url
payment_pointer
stripe_api_key
stripe_publishable_key
health_check_token
feed_style
feed_strategy
default_font
sponsor_headline
public
twitter_key
twitter_secret
github_key
github_secret
facebook_key
facebook_secret
invite_only_mode
allow_email_password_registration
allow_email_password_login
primary_brand_color_hex
spam_trigger_terms
recaptcha_site_key
recaptcha_secret_key
video_encoder_key
].freeze
layout "admin"
before_action :extra_authorization_and_confirmation, only: [:create]
before_action :validate_inputs, only: [:create]
def show
@confirmation_text = confirmation_text
end
def create
clean_up_params
config_params.each do |key, value|
if value.is_a?(Array)
update_siteconfig_with_array(key, value)
elsif value.respond_to?(:to_h)
SiteConfig.public_send("#{key}=", value.to_h) unless value.empty?
else
SiteConfig.public_send("#{key}=", value.strip) unless value.nil?
end
end
bust_relevant_caches
redirect_to admin_config_path, notice: "Site configuration was successfully updated."
end
private
def confirmation_text
"My username is @#{current_user.username} and this action is 100% safe and appropriate."
end
def config_params
all_params = ALLOWED_PARAMS |
CAMPAIGN_PARAMS |
COMMUNITY_PARAMS |
NEWSLETTER_PARAMS |
RATE_LIMIT_PARAMS |
MASCOT_PARAMS |
IMAGE_PARAMS |
ONBOARDING_PARAMS |
JOB_PARAMS
has_emails = params.dig(:site_config, :email_addresses).present?
params[:site_config][:email_addresses][:default] = ApplicationConfig["DEFAULT_EMAIL"] if has_emails
params&.require(:site_config)&.permit(
all_params,
authentication_providers: [],
social_media_handles: SiteConfig.social_media_handles.keys,
email_addresses: SiteConfig.email_addresses.keys,
meta_keywords: SiteConfig.meta_keywords.keys,
credit_prices_in_cents: SiteConfig.credit_prices_in_cents.keys,
)&.with_defaults(authentication_providers: [])
end
def raise_confirmation_mismatch_error
raise ActionController::BadRequest.new, "The confirmation key does not match"
end
def extra_authorization_and_confirmation
not_authorized unless current_user.has_role?(:single_resource_admin, Config) # Special additional permission
raise_confirmation_mismatch_error if params.require(:confirmation) != confirmation_text
end
def validate_inputs
errors = []
errors << "Brand color must be darker for accessibility." if brand_contrast_too_low
errors << "Brand color must be be a 6 character hex (starting with #)." if brand_color_not_hex
redirect_to admin_config_path, alert: "😭 #{errors.join(',')}" if errors.any?
end
def clean_up_params
config = params[:site_config]
return unless config
%i[sidebar_tags suggested_tags suggested_users].each do |param|
config[param] = config[param]&.downcase&.delete(" ") if config[param]
end
config[:credit_prices_in_cents]&.transform_values!(&:to_i)
end
def bust_relevant_caches
CacheBuster.bust("/tags/onboarding") # Needs to change when suggested_tags is edited.
CacheBuster.bust("/shell_top") # Cached at edge, sent to service worker.
CacheBuster.bust("/shell_bottom") # Cached at edge, sent to service worker.
CacheBuster.bust("/onboarding") # Page is cached at edge.
CacheBuster.bust("/") # Page is cached at edge.
Rails.cache.delete_matched("*-#{ApplicationConfig['RELEASE_FOOTPRINT']}") # Delete all caches tied to this key.
end
# Validations
def brand_contrast_too_low
hex = params.dig(:site_config, :primary_brand_color_hex)
hex.present? && Color::Accessibility.new(hex).low_contrast?
end
def brand_color_not_hex
hex = params.dig(:site_config, :primary_brand_color_hex)
hex.present? && !hex.match?(/\A#(\h{6}|\h{3})\z/)
end
def update_siteconfig_with_array(key, value)
return if value.empty? && ALLOWED_EMPTY_ENUMERABLES.exclude?(key.to_sym)
SiteConfig.public_send("#{key}=", value.reject(&:blank?))
end
end
end