Module: CoreSystemConfiguration

Extended by:
ActiveSupport::Concern
Defined in:
lib/app/models/concerns/core_system_configuration.rb

Overview

The System configuration. Various configuration items that can be updated/defined at run time

Use of this class allows you to simply ask for the configuration parameter directly without first having to get an instance of it.

SystemConfiguration.queue_impl #=> ‘RedisQueue’

This method only is allowed for accessors, you should NEVER set values on the SystemConfiguration unless you are updating via the Admin or Stack UI, or during testing to setup a specific configuration for that.

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/app/models/concerns/core_system_configuration.rb', line 18

def self.included(base)
  base.class_eval do
    #
    # Fields
    #
    field :environment, type: String, default: 'test'
    # SMTP configuration
    field :default_email, type: String, default: '[email protected]'
    field :support_email, type: String, default: '[email protected]'
    field :smtp_name, type: String
    field :smtp_address, type: String
    field :smtp_domain, type: String
    field :smtp_port, type: Integer, default: 587
    field :smtp_user_name, type: String
    field :smtp_password, type: String
    field :smtp_enable_starttls_auto, type: Boolean
    field :mailgun_api_key, type: String
    # Twillio support
    field :twilio_account_id, type: String
    field :twilio_auth_token, type: String
    field :twilio_phone_number, type: String
    # URLs
    field :base_url, type: String
    field :cdn_url, type: String
    # Slack support
    field :slack_api_url, type: String
    field :slack_support_channel, type: String, default: 'support'
    field :slack_sales_channel, type: String, default: 'sales'
    # Time Zone Support
    field :default_time_zone, type: String, default: 'US/Eastern'
    # AWS
    field :aws_region, type: String
    field :aws_access_key, type: String
    field :aws_access_secret, type: String
    field :aws_auto_scaling_group_name, type: String
    # Zendesk
    field :zendesk_token, type: String
    field :zendesk_base_url, type: String, default: 'https://app47.zendesk.com'
    field :zendesk_documentation_path, type: String, default: 'hc'
    field :zendesk_support_path, type: String, default: 'hc/en-us/requests'
    field :zendesk_updates_path, type: String, default: 'hc'
    # Switchboard
    field :switchboard_base_url, type: String, default: 'https://switchboard.app47.com'
    field :switchboard_stack_id, type: String
    field :switchboard_stack_api_token, type: String
    #
    # Validations
    #
    validates :environment, presence: true, uniqueness: true
    validates :slack_support_channel, presence: true
    validates :slack_sales_channel, presence: true
    validates :default_time_zone, presence: true
  end
  base.extend ClassMethods
end

Instance Method Details

#aws_auto_scaling_configured?Boolean

Determine if auto scaling group is configured

Returns:



163
164
165
# File 'lib/app/models/concerns/core_system_configuration.rb', line 163

def aws_auto_scaling_configured?
  aws_configured? && aws_auto_scaling_group_name.present?
end

#aws_configured?Boolean

Determine if AWS is configured

Returns:



156
157
158
# File 'lib/app/models/concerns/core_system_configuration.rb', line 156

def aws_configured?
  [aws_region.present?, aws_access_key.present?, aws_access_secret.present?].all?
end

#aws_ec2_clientObject

AWS client.



170
171
172
173
174
175
# File 'lib/app/models/concerns/core_system_configuration.rb', line 170

def aws_ec2_client
  return nil unless aws_configured?

  Aws::EC2::Client.new region: aws_region,
                       credentials: Aws::Credentials.new(aws_access_key, aws_access_secret)
end

#mailgun_configured?Boolean

Determine if mailgun is configured

Returns:



149
150
151
# File 'lib/app/models/concerns/core_system_configuration.rb', line 149

def mailgun_configured?
  smtp_configured? && mailgun_api_key.present?
end

#secure_fieldsObject

Make sure the password doesn’t get blanked out on an update



130
131
132
133
134
135
136
137
# File 'lib/app/models/concerns/core_system_configuration.rb', line 130

def secure_fields
  super + i[smtp_password
             aws_access_secret
             mailgun_api_key
             switchboard_stack_api_token
             twilio_auth_token
             zendesk_token]
end

#slack_configured?Boolean

Determine if Slack is configured

Examples

switchboard_configured?
# => true || false

Returns:



270
271
272
# File 'lib/app/models/concerns/core_system_configuration.rb', line 270

def slack_configured?
  slack_api_url.present?
end

#smtp_configured?Boolean

Determine if SMTP is configured

Returns:



142
143
144
# File 'lib/app/models/concerns/core_system_configuration.rb', line 142

def smtp_configured?
  smtp_name.present? && smtp_address.present? && smtp_domain.present?
end

#switchboard_configured?Boolean

Public: Determine if switchboard is configured

Examples

switchboard_configured?
# => true || false

Returns:



246
247
248
# File 'lib/app/models/concerns/core_system_configuration.rb', line 246

def switchboard_configured?
  [switchboard_base_url.present?, switchboard_stack_api_token.present?, switchboard_stack_id.present?].all?
end

#twilio_configured?Boolean

Determine if twillio is configured at a system configuration

Examples

switchboard_configured?
# => true || false

Returns:



258
259
260
# File 'lib/app/models/concerns/core_system_configuration.rb', line 258

def twilio_configured?
  [.present?, twilio_auth_token.present?, twilio_phone_number.present?].all?
end

#zendesk_configured?Boolean

Is zendesk configured?

Returns:



231
232
233
234
235
236
# File 'lib/app/models/concerns/core_system_configuration.rb', line 231

def zendesk_configured?
  [zendesk_token.present?,
   zendesk_base_url.present?,
   zendesk_documentation_path.present?,
   zendesk_support_path.present?].all?
end

#zendesk_documentation_url(user = nil) ⇒ Object

Return the zendesk documentation URL



180
181
182
# File 'lib/app/models/concerns/core_system_configuration.rb', line 180

def zendesk_documentation_url(user = nil)
  zendesk_url(forward_to: zendesk_documentation_path, user: user)
end

#zendesk_new_request_url(user = nil) ⇒ Object

Return the zendesk support URL



194
195
196
# File 'lib/app/models/concerns/core_system_configuration.rb', line 194

def zendesk_new_request_url(user = nil)
  zendesk_url(forward_to: "#{zendesk_support_path}/new", user: user)
end

#zendesk_requests_url(user = nil) ⇒ Object

Return the zendesk support URL



187
188
189
# File 'lib/app/models/concerns/core_system_configuration.rb', line 187

def zendesk_requests_url(user = nil)
  zendesk_url(forward_to: zendesk_support_path, user: user)
end

#zendesk_updates_url(user = nil) ⇒ Object

Return the zendesk update URL



201
202
203
# File 'lib/app/models/concerns/core_system_configuration.rb', line 201

def zendesk_updates_url(user = nil)
  zendesk_url(forward_to: zendesk_updates_path, user: user)
end

#zendesk_url(forward_to: zendesk_documentation_path, user: nil) ⇒ Object

Generate a Zendesk URL

If a user is passed in and Zendesk is configured then return a JWT enabled URL for SSO authentication to Zendesk.



211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/app/models/concerns/core_system_configuration.rb', line 211

def zendesk_url(forward_to: zendesk_documentation_path, user: nil)
  config = SystemConfiguration.configuration
  path = if config.zendesk_configured? && user.present?
           time_now = Time.now.to_i
           jti = "#{time_now}/#{rand(36**64).to_s(36)}"
           payload = { jwt: JWT.encode({ iat: time_now, # Seconds since epoch, determine when this token is stale
                                         jti: jti, # Unique token identifier, helps prevent replay attacks
                                         name: user.name,
                                         email: user.email }, config.zendesk_token),
                       return_to: CGI.escape([config.zendesk_base_url, forward_to].join('/')) }
           ['access/jwt', payload.to_query].join('?')
         else
           forward_to
         end
  [config.zendesk_base_url, path].join('/')
end