Class: PgRls::Middleware::SetResetConnection

Inherits:
Object
  • Object
show all
Defined in:
lib/pg_rls/middleware/set_reset_connection.rb

Overview

Set RLS if sessions present.

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ SetResetConnection

Returns a new instance of SetResetConnection.



7
8
9
# File 'lib/pg_rls/middleware/set_reset_connection.rb', line 7

def initialize(app)
  @app = app
end

Instance Method Details

#call(env) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/pg_rls/middleware/set_reset_connection.rb', line 11

def call(env)
  tenant = load_tenant_thought_session(env)

  return @app.call(env) if tenant.blank?

  PgRls::Tenant.with_tenant!(tenant) { @app.call(env) }
rescue PgRls::Erorrs::TenantNotFound
  @app.call(env)
rescue ActiveRecord::RecordNotFound => e
  raise e unless rails_active_storage_request?(env)

  [404, { 'Content-Type' => 'text/plain' }, ['Could not find asset']]
end


25
26
27
28
29
30
31
32
# File 'lib/pg_rls/middleware/set_reset_connection.rb', line 25

def load_session_cookie_value(env)
  cookie_string = env['HTTP_COOKIE']
  return if cookie_string.nil?

  cookie_regex = /#{PgRls.session_key}=([^;]+)/
  match = cookie_regex.match(cookie_string)
  match[1] if match
end

#load_tenant_thought_session(env) ⇒ Object



34
35
36
37
38
39
40
41
# File 'lib/pg_rls/middleware/set_reset_connection.rb', line 34

def load_tenant_thought_session(env)
  cookie = load_session_cookie_value(env)

  return if cookie.blank?

  sessions = Rails.cache.read("#{PgRls.session_prefix}#{Digest::SHA256.hexdigest(cookie)}")
  sessions['_tenant']
end

#rails_active_storage_request?(env) ⇒ Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/pg_rls/middleware/set_reset_connection.rb', line 43

def rails_active_storage_request?(env)
  env['PATH_INFO'].start_with?('/rails/active_storage/')
end