zuora_connectD 1.7.09

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +38 -0
  4. data/app/assets/javascripts/zuora_connect/api/v1/app_instance.js +2 -0
  5. data/app/assets/javascripts/zuora_connect/application.js +13 -0
  6. data/app/assets/stylesheets/zuora_connect/api/v1/app_instance.css +4 -0
  7. data/app/assets/stylesheets/zuora_connect/application.css +15 -0
  8. data/app/controllers/zuora_connect/admin/tenant_controller.rb +11 -0
  9. data/app/controllers/zuora_connect/api/v1/app_instance_controller.rb +45 -0
  10. data/app/controllers/zuora_connect/application_controller.rb +8 -0
  11. data/app/controllers/zuora_connect/static_controller.rb +32 -0
  12. data/app/helpers/zuora_connect/api/v1/app_instance_helper.rb +4 -0
  13. data/app/helpers/zuora_connect/application_helper.rb +5 -0
  14. data/app/models/zuora_connect/app_instance.rb +5 -0
  15. data/app/models/zuora_connect/app_instance_base.rb +811 -0
  16. data/app/models/zuora_connect/login.rb +36 -0
  17. data/app/models/zuora_connect/telegraf.rb +88 -0
  18. data/app/views/layouts/zuora_connect/application.html.erb +14 -0
  19. data/app/views/sql/refresh_aggregate_table.txt +84 -0
  20. data/app/views/zuora_connect/static/invalid_app_instance_error.html.erb +65 -0
  21. data/app/views/zuora_connect/static/session_error.html.erb +63 -0
  22. data/config/initializers/apartment.rb +95 -0
  23. data/config/initializers/object_method_hooks.rb +27 -0
  24. data/config/initializers/postgresql_adapter.rb +32 -0
  25. data/config/initializers/prometheus.rb +41 -0
  26. data/config/initializers/redis.rb +10 -0
  27. data/config/initializers/resque.rb +6 -0
  28. data/config/initializers/to_bool.rb +24 -0
  29. data/config/initializers/unicorn.rb +9 -0
  30. data/config/routes.rb +13 -0
  31. data/db/migrate/20100718151733_create_connect_app_instances.rb +9 -0
  32. data/db/migrate/20101024162319_add_tokens_to_app_instance.rb +6 -0
  33. data/db/migrate/20101024220705_add_token_to_app_instance.rb +5 -0
  34. data/db/migrate/20110131211919_add_sessions_table.rb +13 -0
  35. data/db/migrate/20110411200303_add_expiration_to_app_instance.rb +5 -0
  36. data/db/migrate/20110413191512_add_new_api_token.rb +5 -0
  37. data/db/migrate/20110503003602_add_catalog_data_to_app_instance.rb +6 -0
  38. data/db/migrate/20110503003603_add_catalog_mappings_to_app_instance.rb +5 -0
  39. data/db/migrate/20110503003604_catalog_default.rb +5 -0
  40. data/db/migrate/20180301052853_add_catalog_attempted_at.rb +5 -0
  41. data/lib/metrics/influx/point_value.rb +79 -0
  42. data/lib/metrics/net.rb +218 -0
  43. data/lib/middleware/metrics_middleware.rb +110 -0
  44. data/lib/resque/additions.rb +53 -0
  45. data/lib/resque/dynamic_queues.rb +142 -0
  46. data/lib/resque/self_lookup.rb +19 -0
  47. data/lib/resque/silence_done.rb +71 -0
  48. data/lib/tasks/zuora_connect_tasks.rake +24 -0
  49. data/lib/zuora_connectD.rb +41 -0
  50. data/lib/zuora_connectD/configuration.rb +52 -0
  51. data/lib/zuora_connectD/controllers/helpers.rb +165 -0
  52. data/lib/zuora_connectD/engine.rb +30 -0
  53. data/lib/zuora_connectD/exceptions.rb +67 -0
  54. data/lib/zuora_connectD/railtie.rb +59 -0
  55. data/lib/zuora_connectD/version.rb +3 -0
  56. data/lib/zuora_connectD/views/helpers.rb +9 -0
  57. data/test/controllers/zuora_connect/api/v1/app_instance_controller_test.rb +13 -0
  58. data/test/dummy/README.rdoc +28 -0
  59. data/test/dummy/Rakefile +6 -0
  60. data/test/dummy/app/assets/javascripts/application.js +13 -0
  61. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  62. data/test/dummy/app/controllers/application_controller.rb +5 -0
  63. data/test/dummy/app/helpers/application_helper.rb +2 -0
  64. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  65. data/test/dummy/bin/bundle +3 -0
  66. data/test/dummy/bin/rails +4 -0
  67. data/test/dummy/bin/rake +4 -0
  68. data/test/dummy/bin/setup +29 -0
  69. data/test/dummy/config.ru +4 -0
  70. data/test/dummy/config/application.rb +26 -0
  71. data/test/dummy/config/boot.rb +5 -0
  72. data/test/dummy/config/database.yml +25 -0
  73. data/test/dummy/config/environment.rb +5 -0
  74. data/test/dummy/config/environments/development.rb +41 -0
  75. data/test/dummy/config/environments/production.rb +79 -0
  76. data/test/dummy/config/environments/test.rb +42 -0
  77. data/test/dummy/config/initializers/assets.rb +11 -0
  78. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  79. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  80. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  81. data/test/dummy/config/initializers/inflections.rb +16 -0
  82. data/test/dummy/config/initializers/mime_types.rb +4 -0
  83. data/test/dummy/config/initializers/session_store.rb +3 -0
  84. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  85. data/test/dummy/config/locales/en.yml +23 -0
  86. data/test/dummy/config/routes.rb +4 -0
  87. data/test/dummy/config/secrets.yml +22 -0
  88. data/test/dummy/db/development.sqlite3 +0 -0
  89. data/test/dummy/db/test.sqlite3 +0 -0
  90. data/test/dummy/log/development.log +2 -0
  91. data/test/dummy/log/test.log +0 -0
  92. data/test/dummy/public/404.html +67 -0
  93. data/test/dummy/public/422.html +67 -0
  94. data/test/dummy/public/500.html +66 -0
  95. data/test/dummy/public/favicon.ico +0 -0
  96. data/test/fixtures/zuora_connect/app_instances.yml +11 -0
  97. data/test/integration/navigation_test.rb +8 -0
  98. data/test/lib/generators/zuora_connect/datatable_generator_test.rb +16 -0
  99. data/test/models/zuora_connect/app_instance_test.rb +9 -0
  100. data/test/test_helper.rb +21 -0
  101. data/test/zuora_connect_test.rb +7 -0
  102. metadata +416 -0
@@ -0,0 +1,36 @@
1
+ module ZuoraConnect
2
+ class Login
3
+
4
+ def initialize (fields)
5
+ @clients = {}
6
+ if fields["tenant_type"] == "Zuora"
7
+ login_fields = fields.map{|k,v| [k.to_sym, v]}.to_h
8
+ login_type = fields.dig("authentication_type").blank? ? 'Basic' : fields.dig("authentication_type").capitalize
9
+
10
+ @clients["Default"] = "::ZuoraAPI::#{login_type}".constantize.new(login_fields)
11
+ @default_entity = fields["entities"][0]["id"] if fields["entities"].size == 1 if fields["entities"] && fields["entities"].size > 0
12
+ if fields["entities"] && fields["entities"].size > 0
13
+ fields["entities"].each do |entity|
14
+ params = {:entity_id => entity["id"]}.merge(login_fields)
15
+ @clients[entity["id"]] = "::ZuoraAPI::#{login_type}".constantize.new(params)
16
+ end
17
+ end
18
+ self.attr_builder("available_entities", @clients.keys)
19
+ end
20
+ fields.each do |k,v|
21
+ self.attr_builder(k,v)
22
+ end
23
+ @default_entity ||= "Default"
24
+ end
25
+
26
+ def attr_builder(field,val)
27
+ singleton_class.class_eval { attr_accessor "#{field}" }
28
+ send("#{field}=", val)
29
+ end
30
+
31
+ def client(id = @default_entity)
32
+ return id.blank? ? @clients[@default_entity] : @clients[id]
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,88 @@
1
+ module ZuoraConnect
2
+ class Telegraf
3
+ attr_accessor :host
4
+
5
+ OUTBOUND_METRICS = true
6
+ OUTBOUND_METRICS_NAME = "request-outbound"
7
+ INBOUND_METRICS = true
8
+ INBOUND_METRICS_NAME = "request-inbound"
9
+
10
+ def initialize
11
+ self.connect
12
+ end
13
+
14
+ def connect
15
+ Rails.logger.debug(self.format_metric_log('Telegraf','Need new connection')) if ZuoraConnect.configuration.telegraf_debug
16
+ uri = URI.parse(ZuoraConnect.configuration.telegraf_endpoint)
17
+ self.host = UDPSocket.new.tap do |socket|
18
+ socket.connect uri.host, uri.port
19
+ end
20
+ rescue => ex
21
+ self.host = nil
22
+ Rails.logger.warn(self.format_metric_log('Telegraf', 'Failed to connect'))
23
+ Rails.logger.warn(self.format_metric_log('Telegraf', ex.class))
24
+ Rails.logger.warn(self.format_metric_log('Telegraf', ex.message))
25
+ end
26
+
27
+ def write(direction: 'Unknown', tags: {}, values: {})
28
+ time = Benchmark.measure do |bench|
29
+ # To avoid writing metrics from rspec tests
30
+ if Rails.env.to_sym != :test
31
+ app_instance = Thread.current[:appinstance].present? ? Thread.current[:appinstance].id : 0
32
+ tags = { app_name: app_name, process_type: process_type, app_instance: app_instance, pod_name: pod_name}.merge(tags)
33
+
34
+ if direction == :inbound
35
+ self.write_udp(series: INBOUND_METRICS_NAME, tags: tags, values: values) if INBOUND_METRICS
36
+ elsif direction == :outbound
37
+ self.write_udp(series: OUTBOUND_METRICS_NAME, tags: tags, values: values) if OUTBOUND_METRICS
38
+ else
39
+ self.write_udp(series: direction, tags: tags, values: values)
40
+ end
41
+ end
42
+ end
43
+ if ZuoraConnect.configuration.telegraf_debug
44
+ Rails.logger.debug(self.format_metric_log('Telegraf', tags.to_s))
45
+ Rails.logger.debug(self.format_metric_log('Telegraf', values.to_s))
46
+ Rails.logger.debug(self.format_metric_log('Telegraf', "Writing '#{direction.capitalize}': #{time.real.round(5)} ms"))
47
+ end
48
+ end
49
+
50
+
51
+ def write_udp(series: '', tags: {}, values: {})
52
+ return if !values.present?
53
+
54
+ self.host.write InfluxDB::PointValue.new({series: series, tags: tags, values: values}).dump
55
+ rescue => ex
56
+ self.connect
57
+ Rails.logger.warn(self.format_metric_log('Telegraf','Failed to write udp'))
58
+ Rails.logger.warn(self.format_metric_log('Telegraf', ex.class))
59
+ Rails.logger.warn(self.format_metric_log('Telegraf', ex.message))
60
+ end
61
+
62
+ def app_name
63
+ return ENV['DEIS_APP'].present? ? ENV['DEIS_APP'] : Rails.application.class.parent_name
64
+ end
65
+
66
+ def pod_name
67
+ return ENV['HOSTNAME'].present? ? ENV['HOSTNAME'] : 'Unknown'
68
+ end
69
+
70
+ # Returns the process type if any
71
+ def process_type
72
+ p_type = 'Unknown'
73
+ if ENV['HOSTNAME'] && ENV['DEIS_APP']
74
+ temp = ENV['HOSTNAME'].split(ENV['DEIS_APP'])[1]
75
+ temp = temp.split(/(-[0-9a-zA-Z]{5})$/)[0] # remove the 5 char hash
76
+ p_type = temp[1, temp.rindex("-")-1]
77
+ end
78
+ return p_type
79
+ end
80
+
81
+ def format_metric_log(message, dump = nil)
82
+ message_color, dump_color = "1;91", "0;1"
83
+ log_entry = " \e[#{message_color}m#{message}\e[0m "
84
+ log_entry << "\e[#{dump_color}m%#{String === dump ? 's' : 'p'}\e[0m" % dump if dump
85
+ log_entry
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Connect</title>
5
+ <%= stylesheet_link_tag "zuora_connectD/application", media: "all" %>
6
+ <%= javascript_include_tag "zuora_connectD/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,84 @@
1
+ CREATE OR REPLACE FUNCTION "shared_extensions".refresh_aggregate_table(aggregate_table_name text, table_name text, filter text, mode text) RETURNS void AS $$
2
+ DECLARE
3
+ schema RECORD;
4
+ result RECORD;
5
+ sql TEXT := '';
6
+ i INTEGER;
7
+ created boolean := false;
8
+ fields_order character varying;
9
+ index_name varchar;
10
+ index_string varchar;
11
+ index_id varchar;
12
+ BEGIN
13
+ IF mode = 'Table' THEN
14
+ raise notice 'Starting aggregate of % to %', table_name, aggregate_table_name;
15
+
16
+
17
+ EXECUTE format('DROP TABLE IF EXISTS "public".%I', aggregate_table_name);
18
+ raise notice 'Filter %', filter;
19
+
20
+ FOR schema IN EXECUTE
21
+ format(
22
+ 'SELECT schema_name FROM information_schema.schemata WHERE schema_name ~ ''^[0-9]+$'''
23
+ )
24
+ LOOP
25
+ IF NOT created THEN
26
+ -- Create the aggregate table if we haven't already
27
+ EXECUTE format(
28
+ 'CREATE TABLE "public".%I (LIKE %I.%I)',
29
+ aggregate_table_name,
30
+ schema.schema_name, table_name
31
+ );
32
+ -- Add a special `schema_name` column, which we'll populate with the name of the schema
33
+ -- each row originated from
34
+ EXECUTE format(
35
+ 'ALTER TABLE "public".%I ADD COLUMN schema_name text', aggregate_table_name
36
+ );
37
+ created := true;
38
+ END IF;
39
+
40
+ -- Finally, we'll select everything from this schema's target table, plus the schema's name,
41
+ -- and insert them into our new aggregate table
42
+ EXECUTE format(
43
+ 'SELECT string_agg(column_name, '','') from information_schema.columns where table_name = ''%s'' AND table_schema = ''%s''',
44
+ table_name, schema.schema_name
45
+ ) into fields_order;
46
+
47
+ raise notice 'Importing Schema %', schema.schema_name;
48
+
49
+ EXECUTE format(
50
+ 'INSERT INTO "public".%I (schema_name, %s) (SELECT ''%s'' AS schema_name, * FROM %I.%I %s )',
51
+ aggregate_table_name,
52
+ fields_order,
53
+ schema.schema_name,
54
+ schema.schema_name, table_name,
55
+ filter
56
+ );
57
+ END LOOP;
58
+
59
+ EXECUTE
60
+ format('CREATE INDEX ON "public".%I (schema_name)', aggregate_table_name);
61
+ EXECUTE
62
+ format('CREATE INDEX ON "public".%I (id)', aggregate_table_name);
63
+ END IF;
64
+ IF mode = 'Index' THEN
65
+ FOR index_string, index_name, index_id IN
66
+ SELECT pg_get_indexdef(idx.oid)||';', idx.relname, idx.oid
67
+ from pg_index ind
68
+ join pg_class idx on idx.oid = ind.indexrelid
69
+ join pg_class tbl on tbl.oid = ind.indrelid
70
+ left join pg_namespace ns on ns.oid = tbl.relnamespace where idx.relname != concat(table_name, '_pkey') and tbl.relname = table_name and ns.nspname = 'public'
71
+ LOOP
72
+ BEGIN
73
+ EXECUTE
74
+ format('DROP INDEX IF EXISTS "public"."%s"', concat(aggregate_table_name, '_', index_id));
75
+
76
+ EXECUTE
77
+ format(replace(replace(index_string, index_name, concat(aggregate_table_name, '_', index_id)), concat(' ', table_name, ' '), concat( ' ', aggregate_table_name, ' ')));
78
+
79
+ RAISE NOTICE 'Creating Indexes %', replace(replace(replace(index_string, index_name, concat(aggregate_table_name, '_', index_id)), concat(' ', table_name, ' '), concat( ' ', aggregate_table_name, ' ')), concat('public.', table_name), concat( 'public.', aggregate_table_name)) ;
80
+ END;
81
+ END LOOP;
82
+ END IF;
83
+ END
84
+ $$ LANGUAGE plpgsql;
@@ -0,0 +1,65 @@
1
+ <html><head>
2
+ <title>We're sorry, but something went wrong (500)</title>
3
+ <meta name="viewport" content="width=device-width,initial-scale=1">
4
+ <style>
5
+ body {
6
+ background-color: #EFEFEF;
7
+ color: #2E2F30;
8
+ text-align: center;
9
+ font-family: arial, sans-serif;
10
+ margin: 0;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 95%;
15
+ max-width: 33em;
16
+ margin: 4em auto 0;
17
+ }
18
+
19
+ div.dialog > div {
20
+ border: 1px solid #CCC;
21
+ border-right-color: #999;
22
+ border-left-color: #999;
23
+ border-bottom-color: #BBB;
24
+ border-top: #B00100 solid 4px;
25
+ border-top-left-radius: 9px;
26
+ border-top-right-radius: 9px;
27
+ background-color: white;
28
+ padding: 7px 12% 0;
29
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
30
+ }
31
+
32
+ h1 {
33
+ font-size: 100%;
34
+ color: #730E15;
35
+ line-height: 1.5em;
36
+ }
37
+
38
+ div.dialog > p {
39
+ margin: 0 0 1em;
40
+ padding: 1em;
41
+ background-color: #F7F7F7;
42
+ border: 1px solid #CCC;
43
+ border-right-color: #999;
44
+ border-left-color: #999;
45
+ border-bottom-color: #999;
46
+ border-bottom-left-radius: 4px;
47
+ border-bottom-right-radius: 4px;
48
+ border-top-color: #DADADA;
49
+ color: #666;
50
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
51
+ }
52
+ </style>
53
+ </head>
54
+
55
+ <body>
56
+ <!-- This file lives in public/500.html -->
57
+ <div class="dialog">
58
+ <div>
59
+ <h1>We're sorry, but this request could not be verified.</h1>
60
+ </div>
61
+ <p>Please try relaunching this application at connect.zuora.com</p>
62
+ </div>
63
+
64
+
65
+ </body></html>
@@ -0,0 +1,63 @@
1
+ <html><head>
2
+ <title>We're sorry, but something went wrong (500)</title>
3
+ <meta name="viewport" content="width=device-width,initial-scale=1">
4
+ <style>
5
+ body {
6
+ background-color: #EFEFEF;
7
+ color: #2E2F30;
8
+ text-align: center;
9
+ font-family: arial, sans-serif;
10
+ margin: 0;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 95%;
15
+ max-width: 33em;
16
+ margin: 4em auto 0;
17
+ }
18
+
19
+ div.dialog > div {
20
+ border: 1px solid #CCC;
21
+ border-right-color: #999;
22
+ border-left-color: #999;
23
+ border-bottom-color: #BBB;
24
+ border-top: #B00100 solid 4px;
25
+ border-top-left-radius: 9px;
26
+ border-top-right-radius: 9px;
27
+ background-color: white;
28
+ padding: 7px 12% 0;
29
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
30
+ }
31
+
32
+ h1 {
33
+ font-size: 100%;
34
+ color: #730E15;
35
+ line-height: 1.5em;
36
+ }
37
+
38
+ div.dialog > p {
39
+ margin: 0 0 1em;
40
+ padding: 1em;
41
+ background-color: #F7F7F7;
42
+ border: 1px solid #CCC;
43
+ border-right-color: #999;
44
+ border-left-color: #999;
45
+ border-bottom-color: #999;
46
+ border-bottom-left-radius: 4px;
47
+ border-bottom-right-radius: 4px;
48
+ border-top-color: #DADADA;
49
+ color: #666;
50
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
51
+ }
52
+ </style>
53
+ </head>
54
+
55
+ <body>
56
+ <!-- This file lives in public/500.html -->
57
+ <div class="dialog">
58
+ <div>
59
+ <h1>Session is invalid</h1>
60
+ </div>
61
+ <p>Please try relaunching the application from connect.zuora.com</p>
62
+ </div>
63
+ </body></html>
@@ -0,0 +1,95 @@
1
+ # You can have Apartment route to the appropriate Tenant by adding some Rack middleware.
2
+ # Apartment can support many different "Elevators" that can take care of this routing to your data.
3
+ # Require whichever Elevator you're using below or none if you have a custom one.
4
+ #
5
+ # require 'apartment/elevators/generic'
6
+ # require 'apartment/elevators/domain'
7
+ #require 'apartment/elevators/subdomain'
8
+ # require 'apartment/elevators/first_subdomain'
9
+ #
10
+ # Apartment Configuration
11
+ #
12
+ Apartment.configure do |config|
13
+
14
+ # Add any models that you do not want to be multi-tenanted, but remain in the global (public) namespace.
15
+ # A typical example would be a Customer or Tenant model that stores each Tenant's information.
16
+ #
17
+ # config.excluded_models = %w{ Tenant }
18
+
19
+ # In order to migrate all of your Tenants you need to provide a list of Tenant names to Apartment.
20
+ # You can make this dynamic by providing a Proc object to be called on migrations.
21
+ # This object should yield either:
22
+ # - an array of strings representing each Tenant name.
23
+ # - a hash which keys are tenant names, and values custom db config (must contain all key/values required in database.yml)
24
+ #
25
+ # config.tenant_names = lambda{ Customer.pluck(:tenant_name) }
26
+ # config.tenant_names = ['tenant1', 'tenant2']
27
+ # config.tenant_names = {
28
+ # 'tenant1' => {
29
+ # adapter: 'postgresql',
30
+ # host: 'some_server',
31
+ # port: 5555,
32
+ # database: 'postgres' # this is not the name of the tenant's db
33
+ # # but the name of the database to connect to before creating the tenant's db
34
+ # # mandatory in postgresql
35
+ # },
36
+ # 'tenant2' => {
37
+ # adapter: 'postgresql',
38
+ # database: 'postgres' # this is not the name of the tenant's db
39
+ # # but the name of the database to connect to before creating the tenant's db
40
+ # # mandatory in postgresql
41
+ # }
42
+ # }
43
+ # config.tenant_names = lambda do
44
+ # Tenant.all.each_with_object({}) do |tenant, hash|
45
+ # hash[tenant.name] = tenant.db_configuration
46
+ # end
47
+ # end
48
+ #
49
+ config.tenant_names = lambda { ZuoraConnect::AppInstance.pluck :id }
50
+ if defined?(ActiveRecord::SessionStore::Session)
51
+ config.excluded_models = ["ZuoraConnect::AppInstance","ZuoraConnect::AppInstanceBase", "ActiveRecord::SessionStore::Session"]
52
+ else
53
+ config.excluded_models = ["ZuoraConnect::AppInstance","ZuoraConnect::AppInstanceBase"]
54
+ end
55
+ #
56
+ # ==> PostgreSQL only options
57
+
58
+ # Specifies whether to use PostgreSQL schemas or create a new database per Tenant.
59
+ # The default behaviour is true.
60
+ #
61
+ config.use_schemas = true
62
+
63
+ # Apartment can be forced to use raw SQL dumps instead of schema.rb for creating new schemas.
64
+ # Use this when you are using some extra features in PostgreSQL that can't be respresented in
65
+ # schema.rb, like materialized views etc. (only applies with use_schemas set to true).
66
+ # (Note: this option doesn't use db/structure.sql, it creates SQL dump by executing pg_dump)
67
+ #
68
+ # config.use_sql = false
69
+
70
+ # There are cases where you might want some schemas to always be in your search_path
71
+ # e.g when using a PostgreSQL extension like hstore.
72
+ # Any schemas added here will be available along with your selected Tenant.
73
+ #
74
+ config.persistent_schemas = %w{ shared_extensions }
75
+
76
+ # <== PostgreSQL only options
77
+ #
78
+
79
+ # By default, and only when not using PostgreSQL schemas, Apartment will prepend the environment
80
+ # to the tenant name to ensure there is no conflict between your environments.
81
+ # This is mainly for the benefit of your development and test environments.
82
+ # Uncomment the line below if you want to disable this behaviour in production.
83
+ #
84
+ # config.prepend_environment = !Rails.env.production?
85
+ end
86
+
87
+ # Setup a custom Tenant switching middleware. The Proc should return the name of the Tenant that
88
+ # you want to switch to.
89
+ # Rails.application.config.middleware.use 'Apartment::Elevators::Generic', lambda { |request|
90
+ # request.host.split('.').first
91
+ # }
92
+
93
+ # Rails.application.config.middleware.use 'Apartment::Elevators::Domain'
94
+ #Rails.application.config.middleware.use 'Apartment::Elevators::Subdomain'
95
+ # Rails.application.config.middleware.use 'Apartment::Elevators::FirstSubdomain'