Class: Ekylibre::MultiTenancy::Middleware::ContainerAwareRackMiddleware

Inherits:
Object
  • Object
show all
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

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_subdomainsObject



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