loomio/loomio

View on GitHub
app/extras/app_config.rb

Summary

Maintainability
A
1 hr
Test Coverage
class AppConfig
  CONFIG_FILES = %w(
    webhook_event_kinds
    colors
    emojis
    poll_types
    poll_templates
    discussion_templates
    providers
    doctypes
    locales
  )

  BANNED_CHARS = %(\\s:,;'"`<>)
  EMAIL_REGEX  = /[^#{BANNED_CHARS}]+?@[^#{BANNED_CHARS}]+\.[^#{BANNED_CHARS}]+/
  URL_REGEX    = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)/

  CONFIG_FILES.each do |config|
    define_singleton_method(config) do
      instance_variable_get(:"@#{config}") ||
      instance_variable_set(:"@#{config}", YAML.load_file(Rails.root.join("config", "#{config}.yml")))
    end
  end

  def self.release
    @release ||= begin
      (`git rev-parse HEAD`.strip.presence || File.mtime("app").to_i.to_s)
    end
  end

  def self.image_regex
    doctypes.detect { |type| type['name'] == 'image' }['regex']
  end

  def self.theme

    brand_colors = {
      gold: "#DCA034",
      ink: "#293C4A",
      wellington: "#7F9EA0",
      sunset: "#E4C2B9",
      sky: "#658AE7",
      rock: "#C77C3B",
      white: "#FFFFFF"
    }

    # here are some useful variations on these colours
    # https://maketintsandshades.com/#DCA034,293C4A,7F9EA0,E4C2B9,658AE7,C77C3B

    logo_color = :gold

    {
      brand_colors:                      brand_colors,
      site_name:                         ENV.fetch('SITE_NAME',                     'Loomio'),
      channels_uri:                      ENV.fetch('CHANNELS_URI',                  'ws://localhost:5000'),
      terms_url:                         ENV['TERMS_URL'],
      privacy_url:                       ENV['PRIVACY_URL'],
      canonical_host:                    ENV['CANONICAL_HOST'],
      reply_hostname:                    ENV['REPLY_HOSTNAME'],
      help_url:                          ENV.fetch('HELP_URL',                      'https://help.loomio.com/'),
      icon_src:                          ENV.fetch('THEME_ICON_SRC',                "/brand/icon_#{logo_color}_150h.png"),
      app_logo_src:                      ENV.fetch('THEME_APP_LOGO_SRC',            "/brand/logo_#{logo_color}.svg"),
      apple_touch_src:                   ENV.fetch('APPLE_TOUCH_SRC',               "/brand/touch_icon_gold.png"),
      default_group_cover_src:           ENV.fetch('THEME_DEFAULT_GROUP_COVER_SRC', '/theme/default_group_cover.png'),
      saml_login_provider_name:          ENV.fetch('SAML_LOGIN_PROVIDER_NAME', 'SAML'),
      oauth_login_provider_name:         ENV.fetch('OAUTH_LOGIN_PROVIDER_NAME', 'OAUTH'),
      # used in emails
      email_header_logo_src:             ENV.fetch('THEME_EMAIL_HEADER_LOGO_SRC',   "/brand/logo_#{logo_color}_96h.png"),
      email_footer_logo_src:             ENV.fetch('THEME_EMAIL_FOOTER_LOGO_SRC',   "/brand/logo_#{logo_color}_48h.png"),
      primary_color:                     ENV.fetch('THEME_PRIMARY_COLOR',           brand_colors[:sky]),
      accent_color:                      ENV.fetch('THEME_ACCENT_COLOR',            brand_colors[:gold]),
      text_on_primary_color:             ENV.fetch('THEME_TEXT_ON_PRIMARY_COLOR',   '#ffffff'),
      text_on_accent_color:              ENV.fetch('THEME_TEXT_ON_ACCENT_COLOR',    '#ffffff'),

      vuetify: {
        primary: ENV.fetch('THEME_COLOR_PRIMARY', brand_colors[:sky]),
        secondary: ENV.fetch('THEME_COLOR_SECONDARY', brand_colors[:sunset]),
        accent: ENV.fetch('THEME_COLOR_ACCENT', brand_colors[:gold]),
        error: ENV.fetch('THEME_COLOR_ERROR', nil),
        warning: ENV.fetch('THEME_COLOR_WARNING', nil),
        info: ENV.fetch('THEME_COLOR_INFO', brand_colors[:sky]),
        success: ENV.fetch('THEME_COLOR_SUCCESS', nil),
        anchor: ENV.fetch('THEME_COLOR_ANCHOR', brand_colors[:sky])
      }
    }
  end

  def self.app_features
    {
      env:                        Rails.env,
      subscriptions:              !!ENV.fetch('CHARGIFY_API_KEY', false),
      demos:                      ENV.fetch('FEATURES_DEMO_GROUPS', false),
      trials:                     ENV.fetch('FEATURES_TRIALS', false),
      new_thread_button:          !!ENV.fetch('FEATURES_NEW_THREAD_BUTTON', false),
      email_login:                !ENV['FEATURES_DISABLE_EMAIL_LOGIN'],
      create_user:                !ENV['FEATURES_DISABLE_CREATE_USER'],
      create_group:               !ENV['FEATURES_DISABLE_CREATE_GROUP'],
      public_groups:              !ENV['FEATURES_DISABLE_PUBLIC_GROUPS'],
      help_link:                  !ENV['FEATURES_DISABLE_HELP_LINK'],
      example_content:            !ENV['FEATURES_DISABLE_EXAMPLE_CONTENT'],
      explore_public_groups:      ENV.fetch('FEATURES_EXPLORE_PUBLIC_GROUPS', false),
      template_gallery:           ENV.fetch('FEATURES_TEMPLATE_GALLERY', false),
      show_contact:               ENV.fetch('FEATURES_SHOW_CONTACT', false),
      show_contact_consent:       ENV.fetch('FEATURES_SHOW_CONTACT_CONSENT', false),
      sentry_sample_rate:         ENV.fetch('SENTRY_SAMPLE_RATE', 0.1).to_f,
      hidden_poll_templates:      %w[proposal question],
      scrub_user_deactivate:      !!ENV.fetch('SCRUB_USER_DEACTIVATE', false),
      transcription:              TranscriptionService.available?
    }
  end

  def self.json_parse_or_false(name)
    if ENV[name]
      JSON.parse(ENV[name])
    else
      false
    end
  end
end