Class: Ekylibre::MultiTenancy::Middleware::ContainerAwareRackMiddleware
- Inherits:
-
Object
- Object
- Ekylibre::MultiTenancy::Middleware::ContainerAwareRackMiddleware
- Defined in:
- lib/ekylibre/multi_tenancy/middleware/container_aware_rack_middleware.rb
Overview
Provides a rack based tenant switching solution based on request
Class Attribute Summary collapse
Instance Method Summary collapse
- #call(env) ⇒ Object
- #extract_tenant(request) ⇒ Object
-
#initialize(app) ⇒ ContainerAwareRackMiddleware
constructor
A new instance of ContainerAwareRackMiddleware.
Constructor Details
#initialize(app) ⇒ ContainerAwareRackMiddleware
Returns a new instance of ContainerAwareRackMiddleware.
20 21 22 |
# File 'lib/ekylibre/multi_tenancy/middleware/container_aware_rack_middleware.rb', line 20 def initialize(app) @app = app end |
Class Attribute Details
.excluded_subdomains ⇒ Object
15 16 17 |
# File 'lib/ekylibre/multi_tenancy/middleware/container_aware_rack_middleware.rb', line 15 def excluded_subdomains @excluded_subdomains ||= [] end |
Instance Method Details
#call(env) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/ekylibre/multi_tenancy/middleware/container_aware_rack_middleware.rb', line 24 def call(env) request = Rack::Request.new(env) container = env.fetch('container').dup PluginSystem::GlobalContainer.replace_with(container) do env['container'] = container database = extract_tenant(request) begin if database container .get(TenantSwitcher) .switch(database) { @app.call(env) } else @app.call(env) end rescue ::Apartment::TenantNotFound Rails.logger.error "Apartment Tenant not found: #{subdomain(request.host)}" return [404, { 'Content-Type' => 'text/html' }, [File.read(Rails.root.join('public', '404.html'))]] end end end |
#extract_tenant(request) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/ekylibre/multi_tenancy/middleware/container_aware_rack_middleware.rb', line 48 def extract_tenant(request) if (tenant = ENV['tenant']) tenant elsif ::Rails.env.test? 'test' elsif ENV['ELEVATOR'] == 'header' request.env['HTTP_X_TENANT'] else extract_subdomain(request) end end |