zuora_connectD 1.7.09
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +38 -0
- data/app/assets/javascripts/zuora_connect/api/v1/app_instance.js +2 -0
- data/app/assets/javascripts/zuora_connect/application.js +13 -0
- data/app/assets/stylesheets/zuora_connect/api/v1/app_instance.css +4 -0
- data/app/assets/stylesheets/zuora_connect/application.css +15 -0
- data/app/controllers/zuora_connect/admin/tenant_controller.rb +11 -0
- data/app/controllers/zuora_connect/api/v1/app_instance_controller.rb +45 -0
- data/app/controllers/zuora_connect/application_controller.rb +8 -0
- data/app/controllers/zuora_connect/static_controller.rb +32 -0
- data/app/helpers/zuora_connect/api/v1/app_instance_helper.rb +4 -0
- data/app/helpers/zuora_connect/application_helper.rb +5 -0
- data/app/models/zuora_connect/app_instance.rb +5 -0
- data/app/models/zuora_connect/app_instance_base.rb +811 -0
- data/app/models/zuora_connect/login.rb +36 -0
- data/app/models/zuora_connect/telegraf.rb +88 -0
- data/app/views/layouts/zuora_connect/application.html.erb +14 -0
- data/app/views/sql/refresh_aggregate_table.txt +84 -0
- data/app/views/zuora_connect/static/invalid_app_instance_error.html.erb +65 -0
- data/app/views/zuora_connect/static/session_error.html.erb +63 -0
- data/config/initializers/apartment.rb +95 -0
- data/config/initializers/object_method_hooks.rb +27 -0
- data/config/initializers/postgresql_adapter.rb +32 -0
- data/config/initializers/prometheus.rb +41 -0
- data/config/initializers/redis.rb +10 -0
- data/config/initializers/resque.rb +6 -0
- data/config/initializers/to_bool.rb +24 -0
- data/config/initializers/unicorn.rb +9 -0
- data/config/routes.rb +13 -0
- data/db/migrate/20100718151733_create_connect_app_instances.rb +9 -0
- data/db/migrate/20101024162319_add_tokens_to_app_instance.rb +6 -0
- data/db/migrate/20101024220705_add_token_to_app_instance.rb +5 -0
- data/db/migrate/20110131211919_add_sessions_table.rb +13 -0
- data/db/migrate/20110411200303_add_expiration_to_app_instance.rb +5 -0
- data/db/migrate/20110413191512_add_new_api_token.rb +5 -0
- data/db/migrate/20110503003602_add_catalog_data_to_app_instance.rb +6 -0
- data/db/migrate/20110503003603_add_catalog_mappings_to_app_instance.rb +5 -0
- data/db/migrate/20110503003604_catalog_default.rb +5 -0
- data/db/migrate/20180301052853_add_catalog_attempted_at.rb +5 -0
- data/lib/metrics/influx/point_value.rb +79 -0
- data/lib/metrics/net.rb +218 -0
- data/lib/middleware/metrics_middleware.rb +110 -0
- data/lib/resque/additions.rb +53 -0
- data/lib/resque/dynamic_queues.rb +142 -0
- data/lib/resque/self_lookup.rb +19 -0
- data/lib/resque/silence_done.rb +71 -0
- data/lib/tasks/zuora_connect_tasks.rake +24 -0
- data/lib/zuora_connectD.rb +41 -0
- data/lib/zuora_connectD/configuration.rb +52 -0
- data/lib/zuora_connectD/controllers/helpers.rb +165 -0
- data/lib/zuora_connectD/engine.rb +30 -0
- data/lib/zuora_connectD/exceptions.rb +67 -0
- data/lib/zuora_connectD/railtie.rb +59 -0
- data/lib/zuora_connectD/version.rb +3 -0
- data/lib/zuora_connectD/views/helpers.rb +9 -0
- data/test/controllers/zuora_connect/api/v1/app_instance_controller_test.rb +13 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +2 -0
- data/test/dummy/log/test.log +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/fixtures/zuora_connect/app_instances.yml +11 -0
- data/test/integration/navigation_test.rb +8 -0
- data/test/lib/generators/zuora_connect/datatable_generator_test.rb +16 -0
- data/test/models/zuora_connect/app_instance_test.rb +9 -0
- data/test/test_helper.rb +21 -0
- data/test/zuora_connect_test.rb +7 -0
- metadata +416 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module ZuoraConnect
|
|
2
|
+
class Configuration
|
|
3
|
+
|
|
4
|
+
attr_accessor :default_locale, :default_time_zone, :url, :mode, :delayed_job,:private_key, :additional_apartment_models
|
|
5
|
+
|
|
6
|
+
attr_accessor :enable_metrics, :telegraf_endpoint, :telegraf_debug, :custom_prometheus_update_block, :silencer_resque_finish
|
|
7
|
+
|
|
8
|
+
attr_accessor :oauth_client_id, :oauth_client_secret, :oauth_client_redirect_uri
|
|
9
|
+
|
|
10
|
+
attr_accessor :dev_mode_logins, :dev_mode_options, :dev_mode_mode, :dev_mode_appinstance, :dev_mode_user, :dev_mode_pass, :dev_mode_admin, :dev_mode_secret_access_key,:dev_mode_access_key_id,:aws_region, :s3_bucket_name, :s3_folder_name
|
|
11
|
+
|
|
12
|
+
def initialize
|
|
13
|
+
@default_locale = :en
|
|
14
|
+
@default_time_zone = Time.zone
|
|
15
|
+
@url = "https://connect.zuora.com"
|
|
16
|
+
@mode = "Production"
|
|
17
|
+
@delayed_job = false
|
|
18
|
+
@private_key = ENV["CONNECT_KEY"]
|
|
19
|
+
@additional_apartment_models = []
|
|
20
|
+
@silencer_resque_finish = true
|
|
21
|
+
|
|
22
|
+
# Setting the app name for telegraf write
|
|
23
|
+
@enable_metrics = false
|
|
24
|
+
@telegraf_endpoint = 'udp://telegraf-app-metrics.monitoring.svc.cluster.local:8094'
|
|
25
|
+
@telegraf_debug = false
|
|
26
|
+
|
|
27
|
+
# OAuth Settings
|
|
28
|
+
@oauth_client_id = ""
|
|
29
|
+
@oauth_client_secret = ""
|
|
30
|
+
@oauth_client_redirect_uri = "https://connect.zuora.com/"
|
|
31
|
+
|
|
32
|
+
# DEV MODE OPTIONS
|
|
33
|
+
@dev_mode_logins = { "target_login" => {"tenant_type" => "Zuora", "username" => "user", "password" => "pass", "url" => "url"} }
|
|
34
|
+
@dev_mode_options = {"name" => {"config_name" => "name", "datatype" => "type", "value" => "value"}}
|
|
35
|
+
@dev_mode_mode = "Universal"
|
|
36
|
+
@dev_mode_appinstance = "1"
|
|
37
|
+
@dev_mode_user = "test"
|
|
38
|
+
@dev_mode_pass = "test"
|
|
39
|
+
@dev_mode_admin = false
|
|
40
|
+
@dev_mode_secret_access_key = nil
|
|
41
|
+
@dev_mode_access_key_id = nil
|
|
42
|
+
@aws_region = "us-west-2"
|
|
43
|
+
@s3_bucket_name = "rbm-apps"
|
|
44
|
+
@s3_folder_name = Rails.application.class.parent_name
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def private_key
|
|
48
|
+
raise "Private Key Not Set" if @private_key.blank?
|
|
49
|
+
@private_key.include?("BEGIN") ? @private_key : Base64.urlsafe_decode64(@private_key)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
require 'apartment/migrator'
|
|
2
|
+
module ZuoraConnect
|
|
3
|
+
module Controllers
|
|
4
|
+
module Helpers
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
def authenticate_app_api_request
|
|
8
|
+
#Skip session for api requests
|
|
9
|
+
Thread.current[:appinstance] = nil
|
|
10
|
+
request.session_options[:skip] = true
|
|
11
|
+
start_time = Time.now
|
|
12
|
+
if request.headers["API-Token"].present?
|
|
13
|
+
@appinstance = ZuoraConnect::AppInstance.where(:api_token => request.headers["API-Token"]).first
|
|
14
|
+
Rails.logger.debug("[#{@appinstance.id}] API REQUEST - API token") if @appinstance.present?
|
|
15
|
+
check_instance
|
|
16
|
+
else
|
|
17
|
+
authenticate_or_request_with_http_basic do |username, password|
|
|
18
|
+
@appinstance = ZuoraConnect::AppInstance.where(:token => password).first
|
|
19
|
+
@appinstance ||= ZuoraConnect::AppInstance.where(:api_token => password).first
|
|
20
|
+
Rails.logger.debug("[#{@appinstance.id}] API REQUEST - Basic Auth") if @appinstance.present?
|
|
21
|
+
check_instance
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
Rails.logger.debug("[#{@appinstance.blank? ? "N/A" : @appinstance.id}] Authenticate App API Request Completed In - #{(Time.now - start_time).round(2)}s")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def authenticate_connect_app_request
|
|
28
|
+
Thread.current[:appinstance] = nil
|
|
29
|
+
start_time = Time.now
|
|
30
|
+
if ZuoraConnect.configuration.mode == "Production"
|
|
31
|
+
if request["data"]
|
|
32
|
+
setup_instance_via_data
|
|
33
|
+
else
|
|
34
|
+
setup_instance_via_session
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
setup_instance_via_dev_mode
|
|
38
|
+
end
|
|
39
|
+
#Call .data_lookup with the current session to retrieve session. In some cases session may be stored/cache in redis
|
|
40
|
+
#so data lookup provides a model method that can be overriden per app.
|
|
41
|
+
if params[:controller] != 'zuora_connect/api/v1/app_instance' && params[:action] != 'drop'
|
|
42
|
+
if @appinstance.new_session_for_ui_requests(:params => params)
|
|
43
|
+
@appinstance.new_session(:session => @appinstance.data_lookup(:session => session))
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
PaperTrail.whodunnit = session["#{@appinstance.id}::user::email"] if defined?(PaperTrail) && session["#{@appinstance.id}::user::email"].present?
|
|
47
|
+
begin
|
|
48
|
+
I18n.locale = session["#{@appinstance.id}::user::locale"] ? session["#{@appinstance.id}::user::locale"] : @appinstance.locale
|
|
49
|
+
rescue I18n::InvalidLocale => ex
|
|
50
|
+
Rails.logger.error("Invalid Locale: #{ex.message}")
|
|
51
|
+
end
|
|
52
|
+
Time.zone = session["#{@appinstance.id}::user::timezone"] ? session["#{@appinstance.id}::user::timezone"] : @appinstance.timezone
|
|
53
|
+
Rails.logger.debug("[#{@appinstance.blank? ? "N/A" : @appinstance.id}] Authenticate App Request Completed In - #{(Time.now - start_time).round(2)}s")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def persist_connect_app_session
|
|
57
|
+
if @appinstance.present?
|
|
58
|
+
if defined?(Redis.current)
|
|
59
|
+
@appinstance.cache_app_instance
|
|
60
|
+
else
|
|
61
|
+
session.merge!(@appinstance.save_data)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def check_connect_admin!
|
|
67
|
+
raise ZuoraConnect::Exceptions::AccessDenied.new("User is not an authorized admin for this application") if !session["#{@appinstance.id}::admin"]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def check_connect_admin
|
|
71
|
+
return session["#{@appinstance.id}::admin"]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
def setup_instance_via_data
|
|
76
|
+
session.clear
|
|
77
|
+
values = JSON.parse(ZuoraConnect::AppInstance.decrypt_response(Base64.urlsafe_decode64(request["data"])))
|
|
78
|
+
Rails.logger.debug("Data: #{values.to_json}")
|
|
79
|
+
if values["param_data"]
|
|
80
|
+
values["param_data"].each do |k ,v|
|
|
81
|
+
params[k] = v
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
session["#{values["appInstance"]}::destroy"] = values["destroy"]
|
|
85
|
+
session["appInstance"] = values["appInstance"]
|
|
86
|
+
if values["current_user"]
|
|
87
|
+
session["#{values["appInstance"]}::admin"] = values["current_user"]["admin"] ? values["current_user"]["admin"] : false
|
|
88
|
+
session["#{values["appInstance"]}::user::timezone"] = values["current_user"]["timezone"]
|
|
89
|
+
session["#{values["appInstance"]}::user::locale"] = values["current_user"]["locale"]
|
|
90
|
+
session["#{values["appInstance"]}::user::email"] = values["current_user"]["email"]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
Rails.logger.debug("App Params: #{values.to_json}}") if Rails.env != "production"
|
|
94
|
+
|
|
95
|
+
@appinstance = ZuoraConnect::AppInstance.where(:id => values["appInstance"].to_i).first
|
|
96
|
+
if @appinstance.blank?
|
|
97
|
+
Apartment::Tenant.switch!("public")
|
|
98
|
+
begin
|
|
99
|
+
Apartment::Tenant.create(values["appInstance"].to_s)
|
|
100
|
+
rescue Apartment::TenantExists => ex
|
|
101
|
+
Rails.logger.debug("Tenant Already Exists")
|
|
102
|
+
end
|
|
103
|
+
@appinstance = ZuoraConnect::AppInstance.new(:api_token => values[:api_token],:id => values["appInstance"].to_i, :access_token => values["access_token"].blank? ? values["user"] : values["access_token"], :token => values["refresh_token"] , :refresh_token => values["refresh_token"].blank? ? values["key"] : values["refresh_token"], :oauth_expires_at => values["expires"])
|
|
104
|
+
@appinstance.save(:validate => false)
|
|
105
|
+
else
|
|
106
|
+
@appinstance.access_token = values["access_token"] if !values["access_token"].blank? && @appinstance.access_token != values["access_token"]
|
|
107
|
+
@appinstance.refresh_token = values["refresh_token"] if !values["refresh_token"].blank? && @appinstance.refresh_token != values["refresh_token"]
|
|
108
|
+
@appinstance.oauth_expires_at = values["expires"] if !values["expires"].blank?
|
|
109
|
+
@appinstance.api_token = values["api_token"] if !values["api_token"].blank? && @appinstance.api_token != values["api_token"]
|
|
110
|
+
if @appinstance.access_token_changed? && @appinstance.refresh_token_changed?
|
|
111
|
+
@appinstance.save(:validate => false)
|
|
112
|
+
else
|
|
113
|
+
raise ZuoraConnect::Exceptions::AccessDenied.new("Authorization mistmatch. Possible tampering")
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def setup_instance_via_session
|
|
119
|
+
if session["appInstance"].present?
|
|
120
|
+
@appinstance = ZuoraConnect::AppInstance.where(:id => session["appInstance"]).first
|
|
121
|
+
else
|
|
122
|
+
raise ZuoraConnect::Exceptions::SessionInvalid.new("Session Blank -- Relaunch Application")
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def setup_instance_via_dev_mode
|
|
127
|
+
session["appInstance"] = ZuoraConnect.configuration.dev_mode_appinstance
|
|
128
|
+
user = ZuoraConnect.configuration.dev_mode_user
|
|
129
|
+
key = ZuoraConnect.configuration.dev_mode_pass
|
|
130
|
+
values = {:user => user , :key => key, :appinstance => session["appInstance"]}
|
|
131
|
+
@appinstance = ZuoraConnect::AppInstance.where(:id => values[:appinstance].to_i).first
|
|
132
|
+
if @appinstance.blank?
|
|
133
|
+
Apartment::Tenant.switch!("public")
|
|
134
|
+
begin
|
|
135
|
+
Apartment::Tenant.create(values[:appinstance].to_s)
|
|
136
|
+
rescue Apartment::TenantExists => ex
|
|
137
|
+
Apartment::Tenant.drop(values[:appinstance].to_s)
|
|
138
|
+
retry
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
@appinstance = ZuoraConnect::AppInstance.new(:id => values[:appinstance].to_i, :access_token => values[:user], :refresh_token => values[:key], :token => "#{values[:key]}#{values[:key]}", :api_token => "#{values[:key]}#{values[:key]}")
|
|
142
|
+
@appinstance.save(:validate => false)
|
|
143
|
+
end
|
|
144
|
+
if @appinstance.access_token.blank? || @appinstance.refresh_token.blank? || @appinstance.token.blank? || @appinstance.api_token.blank?
|
|
145
|
+
@appinstance.update_attributes!(:access_token => values["user"], :refresh_token => values["key"], :token => "#{values[:key]}#{values[:key]}", :api_token => "#{values[:key]}#{values[:key]}")
|
|
146
|
+
end
|
|
147
|
+
session["#{@appinstance.id}::admin"] = ZuoraConnect.configuration.dev_mode_admin
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
#API ONLY
|
|
151
|
+
def check_instance
|
|
152
|
+
if @appinstance.present?
|
|
153
|
+
if @appinstance.new_session_for_api_requests(:params => params)
|
|
154
|
+
@appinstance.new_session(:session => @appinstance.data_lookup(:session => session))
|
|
155
|
+
end
|
|
156
|
+
Thread.current[:appinstance] = @appinstance
|
|
157
|
+
PaperTrail.whodunnit = "API User" if defined?(PaperTrail)
|
|
158
|
+
return true
|
|
159
|
+
else
|
|
160
|
+
render text: "Access Denied", status: :unauthorized
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'rails/all'
|
|
2
|
+
require 'zuora_connectD'
|
|
3
|
+
require 'apartment'
|
|
4
|
+
require 'httparty'
|
|
5
|
+
require 'zuora_apiD'
|
|
6
|
+
module ZuoraConnect
|
|
7
|
+
class Engine < ::Rails::Engine
|
|
8
|
+
isolate_namespace ZuoraConnect
|
|
9
|
+
|
|
10
|
+
initializer "connect", before: :load_config_initializers do |app|
|
|
11
|
+
Rails.application.routes.prepend do
|
|
12
|
+
mount ZuoraConnect::Engine, at: "/connect"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
initializer :append_migrations do |app|
|
|
17
|
+
unless app.root.to_s.match root.to_s
|
|
18
|
+
config.paths["db/migrate"].expanded.each do |expanded_path|
|
|
19
|
+
app.config.paths["db/migrate"] << expanded_path
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
initializer "connect.helpers" do
|
|
25
|
+
ActiveSupport.on_load(:action_controller) do
|
|
26
|
+
include ZuoraConnect::Controllers::Helpers
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module ZuoraConnect
|
|
2
|
+
module Exceptions
|
|
3
|
+
|
|
4
|
+
class HoldingPattern < StandardError; end
|
|
5
|
+
class Error < StandardError; end
|
|
6
|
+
class AuthorizationNotPerformed < Error; end
|
|
7
|
+
|
|
8
|
+
class SessionInvalid < Error
|
|
9
|
+
attr_writer :default_message
|
|
10
|
+
|
|
11
|
+
def initialize(message = nil)
|
|
12
|
+
@message = message
|
|
13
|
+
@default_message = "Session data invalid."
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_s
|
|
17
|
+
@message || @default_message
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class ConnectCommunicationError < Error
|
|
22
|
+
attr_reader :code, :response
|
|
23
|
+
attr_writer :default_message
|
|
24
|
+
|
|
25
|
+
def initialize(message = nil,response=nil, code =nil)
|
|
26
|
+
@code = code
|
|
27
|
+
@message = message
|
|
28
|
+
@response = response
|
|
29
|
+
@default_message = "Error communication with Connect."
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def to_s
|
|
33
|
+
@message || @default_message
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class APIError < Error
|
|
38
|
+
attr_reader :code, :response
|
|
39
|
+
attr_writer :default_message
|
|
40
|
+
|
|
41
|
+
def initialize(message: nil,response: nil, code: nil)
|
|
42
|
+
@code = code
|
|
43
|
+
@message = message
|
|
44
|
+
@response = response
|
|
45
|
+
@default_message = "Connect update error."
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def to_s
|
|
49
|
+
@message || @default_message
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class AccessDenied < Error
|
|
55
|
+
attr_writer :default_message
|
|
56
|
+
|
|
57
|
+
def initialize(message = nil)
|
|
58
|
+
@message = message
|
|
59
|
+
@default_message = "You are not authorized to access this page."
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def to_s
|
|
63
|
+
@message || @default_message
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'middleware/metrics_middleware'
|
|
2
|
+
|
|
3
|
+
module ZuoraConnect
|
|
4
|
+
class Railtie < Rails::Railtie
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
config.before_initialize do
|
|
8
|
+
version = Rails.version
|
|
9
|
+
if version >= "5.0.0"
|
|
10
|
+
::Rails.configuration.public_file_server.enabled = true
|
|
11
|
+
elsif version >= "4.2.0"
|
|
12
|
+
::Rails.configuration.serve_static_files = true
|
|
13
|
+
else
|
|
14
|
+
::Rails.configuration.serve_static_assets = true
|
|
15
|
+
end
|
|
16
|
+
::Rails.configuration.action_dispatch.x_sendfile_header = nil
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if defined? Prometheus
|
|
20
|
+
initializer "prometheus.configure_rails_initialization" do |app|
|
|
21
|
+
app.middleware.use Prometheus::Middleware::Exporter,(options ={:path => '/connect/internal/metrics'})
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
initializer "zuora_connect.configure_rails_initialization" do |app|
|
|
25
|
+
app.middleware.insert_after Rack::Sendfile, Middleware::MetricsMiddleware
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# hook to process_action
|
|
29
|
+
ActiveSupport::Notifications.subscribe('process_action.action_controller', Middleware::PageRequest.new)
|
|
30
|
+
|
|
31
|
+
initializer(:rails_stdout_logging, before: :initialize_logger) do
|
|
32
|
+
if Rails.env != 'development' && !ENV['DEIS_APP'].blank?
|
|
33
|
+
require 'lograge'
|
|
34
|
+
logger = ActiveSupport::Logger.new(STDOUT)
|
|
35
|
+
logger.formatter = ::Logger::Formatter.new
|
|
36
|
+
# logger.formatter = proc do |severity, datetime, progname, msg|
|
|
37
|
+
# {severity: severity, time: datetime.strftime('%FT%T.%6N'), process_id: Process.pid, message: msg }.to_json
|
|
38
|
+
# end
|
|
39
|
+
Rails.configuration.logger = ActiveSupport::TaggedLogging.new(logger)
|
|
40
|
+
Rails.configuration.log_tags = [:uuid]
|
|
41
|
+
Rails.configuration.lograge.enabled = true
|
|
42
|
+
Rails.configuration.lograge.formatter = Lograge::Formatters::Json.new
|
|
43
|
+
Rails.configuration.lograge.custom_options = lambda do |event|
|
|
44
|
+
exceptions = %w(controller action format id)
|
|
45
|
+
items = {
|
|
46
|
+
#time: event.time.strftime('%FT%T.%6N'),
|
|
47
|
+
params: event.payload[:params].except(*exceptions),
|
|
48
|
+
exception: event.payload[:exception],
|
|
49
|
+
exception_object: event.payload[:exception_object],
|
|
50
|
+
process_id: Process.pid
|
|
51
|
+
}
|
|
52
|
+
if Thread.current[:appinstance].present?
|
|
53
|
+
items.merge({appinstance_id: Thread.current[:appinstance].id, connect_user: Thread.current[:appinstance].connect_user, new_session: Thread.current[:appinstance].new_session_message})
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
== README
|
|
2
|
+
|
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
|
4
|
+
application up and running.
|
|
5
|
+
|
|
6
|
+
Things you may want to cover:
|
|
7
|
+
|
|
8
|
+
* Ruby version
|
|
9
|
+
|
|
10
|
+
* System dependencies
|
|
11
|
+
|
|
12
|
+
* Configuration
|
|
13
|
+
|
|
14
|
+
* Database creation
|
|
15
|
+
|
|
16
|
+
* Database initialization
|
|
17
|
+
|
|
18
|
+
* How to run the test suite
|
|
19
|
+
|
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
|
21
|
+
|
|
22
|
+
* Deployment instructions
|
|
23
|
+
|
|
24
|
+
* ...
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
|
28
|
+
<tt>rake doc:app</tt>.
|
data/test/dummy/Rakefile
ADDED