class Ekylibre::MultiTenancy::TenantSwitcher

Service allowing to switch between tenants and keeping track of what need to be cleaned through the use of a TenantStack

Attributes

apartment[R]

@return [#switch, switch!]

tenant_repository[R]

@return [TenantRepository]

tenant_stack[R]

@return [TenantStack]

Public Class Methods

new(apartment:, tenant_stack:, tenant_repository:) click to toggle source

@param [#switch, switch!] apartment @param [TenantStack] tenant_stack @param [TenantRepository] tenant_repository

# File lib/ekylibre/multi_tenancy/tenant_switcher.rb, line 18
def initialize(apartment:, tenant_stack:, tenant_repository:)
  @apartment = apartment
  @tenant_stack = tenant_stack
  @tenant_repository = tenant_repository
  @bang_stack = []
  @bang_switched = false
end

Public Instance Methods

leave!() click to toggle source
# File lib/ekylibre/multi_tenancy/tenant_switcher.rb, line 61
def leave!
  if @bang_switched
    @bang_switched = false
    tenant_stack.pop
    apartment.switch!(tenant_stack.current)
  else
    raise StandardError.new('Cannot leave! if not after switch!')
  end
end
switch(name, &block) click to toggle source

@param [String, to_s] name

# File lib/ekylibre/multi_tenancy/tenant_switcher.rb, line 27
def switch(name, &block)
  name = name.to_s

  tenant = tenant_repository.get(name)
  return if tenant.nil?

  begin
    @bang_stack << @bang_switched
    @bang_switched = false
    tenant_stack.push(tenant)

    apartment.switch(name, &block)
  ensure
    # Make sure we pop the stack twice if we bang_switched
    leave! if @bang_switched
    @bang_switched = @bang_stack.pop
    tenant_stack.pop
  end
end
switch!(name) click to toggle source

@param [String, to_s] name

# File lib/ekylibre/multi_tenancy/tenant_switcher.rb, line 48
def switch!(name)
  name = name.to_s
  tenant = tenant_repository.get(name)
  return if tenant.nil?

  # Some housekeeping to keep the tenant_stack up-to-date
  tenant_stack.pop if @bang_switched
  @bang_switched = true
  tenant_stack.push(tenant)

  apartment.switch!(name)
end