Module: TenantLevelSecurity

Defined in:
lib/activerecord-tenant-level-security/sidekiq.rb,
lib/activerecord-tenant-level-security/version.rb,
lib/activerecord-tenant-level-security/schema_dumper.rb,
lib/activerecord-tenant-level-security/command_recorder.rb,
lib/activerecord-tenant-level-security/schema_statements.rb,
lib/activerecord-tenant-level-security/reconnectable_adapter.rb,
lib/activerecord-tenant-level-security/tenant_level_security.rb

Defined Under Namespace

Modules: CommandRecorder, ReconnectableAdapter, SchemaDumper, SchemaStatements, Sidekiq Classes: TenantContext

Constant Summary collapse

VERSION =
'0.8.0'
DEFAULT_PARTITION_KEY =
'tenant_id'.freeze

Class Method Summary collapse

Class Method Details

.current_session_tenant_idObject



55
56
57
58
59
60
# File 'lib/activerecord-tenant-level-security/tenant_level_security.rb', line 55

def current_session_tenant_id
  ActiveRecord::Base.connection.execute('SHOW tenant_level_security.tenant_id').getvalue(0, 0)
rescue ActiveRecord::StatementInvalid => e
  return nil if e.cause.kind_of? PG::UndefinedObject
  raise
end

.current_tenant_id(&block) ⇒ Object

The current_tenant_id sets the default tenant from the outside. Be sure to register in advance as TenantLevelSecurity.current_tenant_id { id } with initializers. This value is mainly used as the current value when reusing a connection. Therefore, keep in mind that you need to manage it differently from the session value in the database.



22
23
24
25
26
27
28
# File 'lib/activerecord-tenant-level-security/tenant_level_security.rb', line 22

def current_tenant_id(&block)
  if block_given?
    @@block = block
  else
    @@block.call
  end
end

.switch!(tenant_id) ⇒ Object



34
35
36
# File 'lib/activerecord-tenant-level-security/tenant_level_security.rb', line 34

def switch!(tenant_id)
  TenantContext.tenant_id = tenant_id
end

.switch_current_tenant_context!(conn = ActiveRecord::Base.connection) ⇒ Object



38
39
40
41
42
43
# File 'lib/activerecord-tenant-level-security/tenant_level_security.rb', line 38

def switch_current_tenant_context!(conn = ActiveRecord::Base.connection)
  TenantLevelSecurity.switch_with_connection!(
    conn,
    TenantLevelSecurity::TenantContext.tenant_id || TenantLevelSecurity.current_tenant_id
  )
end

.switch_with_connection!(conn, tenant_id) ⇒ Object



45
46
47
48
49
50
51
52
53
# File 'lib/activerecord-tenant-level-security/tenant_level_security.rb', line 45

def switch_with_connection!(conn, tenant_id)
  conn.clear_query_cache

  if tenant_id.present?
    conn.execute("SET tenant_level_security.tenant_id = '#{tenant_id}'")
  else
    conn.execute('SET tenant_level_security.tenant_id TO DEFAULT')
  end
end

.with(tenant_id, &block) ⇒ Object



30
31
32
# File 'lib/activerecord-tenant-level-security/tenant_level_security.rb', line 30

def with(tenant_id, &block)
  TenantContext.with(tenant_id: tenant_id, &block)
end