pg_rls 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/generators/pg_rls/install_generator.rb +12 -0
- data/lib/pg_rls/multi_tenancy.rb +0 -14
- data/lib/pg_rls/tenant.rb +21 -23
- data/lib/pg_rls/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e0133ebb0867d0bfeeea122f6ddef47f861c6b17e2b8b65a07acdca4768c66a
|
4
|
+
data.tar.gz: 5bd700b9dd72150b01e72086f07795772cbb3f3b512e7106dbf58b2850713414
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af0c6529cd940354cbaf1432c7086e1ae336f0d160df036108820873f31699c580833b7b153956e1b599b26946de15e8bfd5eda2dc94e10fa8b0b757fc94bcf1
|
7
|
+
data.tar.gz: 04feda60ca3f7fa0e98f096246db9ba2d4eecac158af08f719631e7f078b224e5dc33b660e92129a6eb70e217bb7e550fdf74843015b1df988272954d756192c
|
data/Gemfile.lock
CHANGED
@@ -16,6 +16,8 @@ module PgRls
|
|
16
16
|
end
|
17
17
|
super
|
18
18
|
end
|
19
|
+
ENVIRONMENT_PATH = 'config/environment.rb'
|
20
|
+
|
19
21
|
APPLICATION_LINE = 'class Application < Rails::Application'
|
20
22
|
APPLICATION_PATH = 'config/application.rb'
|
21
23
|
|
@@ -50,6 +52,12 @@ module PgRls
|
|
50
52
|
template 'pg_rls.rb.tt', 'config/initializers/pg_rls.rb'
|
51
53
|
end
|
52
54
|
|
55
|
+
def inject_include_to_environment
|
56
|
+
return if environment_already_included?
|
57
|
+
|
58
|
+
prepend_to_file(ENVIRONMENT_PATH, "\nrequire_relative 'initializers/pg_rls'\n")
|
59
|
+
end
|
60
|
+
|
53
61
|
def inject_include_to_application
|
54
62
|
return if aplication_already_included?
|
55
63
|
|
@@ -74,6 +82,10 @@ module PgRls
|
|
74
82
|
File.readlines(APPLICATION_PATH).grep(/config.active_record.schema_format = :sql/).any?
|
75
83
|
end
|
76
84
|
|
85
|
+
def environment_already_included?
|
86
|
+
File.readlines(ENVIRONMENT_PATH).grep(/require_relative 'initializers\/pg_rls'/).any?
|
87
|
+
end
|
88
|
+
|
77
89
|
def initialize_error_text
|
78
90
|
<<~ERROR
|
79
91
|
TO DO
|
data/lib/pg_rls/multi_tenancy.rb
CHANGED
@@ -28,19 +28,5 @@ module PgRls
|
|
28
28
|
session[:_tenant] = nil
|
29
29
|
raise PgRls::Errors::TenantNotFound, 'No tenant was found'
|
30
30
|
end
|
31
|
-
|
32
|
-
def switch_tenant_by_resource!(resource = nil)
|
33
|
-
Tenant.switch!(resource)
|
34
|
-
session[:_tenant] = resource
|
35
|
-
rescue PgRls::Errors::TenantNotFound
|
36
|
-
Tenant.switch(session[:_tenant])
|
37
|
-
rescue NoMethodError
|
38
|
-
session[:tenant] = nil
|
39
|
-
redirect_to '/'
|
40
|
-
end
|
41
|
-
|
42
|
-
def tenant_match_session_cookies?
|
43
|
-
session[:_tenant] == request.subdomain
|
44
|
-
end
|
45
31
|
end
|
46
32
|
end
|
data/lib/pg_rls/tenant.rb
CHANGED
@@ -4,15 +4,9 @@ module PgRls
|
|
4
4
|
# Tenant Controller
|
5
5
|
module Tenant
|
6
6
|
class << self
|
7
|
-
attr_reader :tenant
|
8
|
-
|
9
7
|
def switch(resource)
|
10
|
-
|
11
|
-
|
12
|
-
"RLS changed to '#{tenant.id}'"
|
13
|
-
rescue StandardError => e
|
14
|
-
Rails.logger.info('connection was not made')
|
15
|
-
Rails.logger.info(e)
|
8
|
+
switch!(resource)
|
9
|
+
rescue PgRls::Errors::TenantNotFound
|
16
10
|
nil
|
17
11
|
end
|
18
12
|
|
@@ -22,15 +16,18 @@ module PgRls
|
|
22
16
|
"RLS changed to '#{tenant.id}'"
|
23
17
|
rescue StandardError => e
|
24
18
|
Rails.logger.info('connection was not made')
|
25
|
-
raise
|
19
|
+
raise PgRls::Errors::TenantNotFound
|
26
20
|
end
|
27
21
|
|
22
|
+
|
28
23
|
def with_tenant!(resource)
|
29
|
-
|
24
|
+
PgRls.main_model.connection_pool.with_connection do
|
25
|
+
tenant = switch_tenant!(resource)
|
30
26
|
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
yield(tenant).presence if block_given?
|
28
|
+
ensure
|
29
|
+
reset_rls! unless PgRls.test_inline_tenant == true
|
30
|
+
end
|
34
31
|
end
|
35
32
|
|
36
33
|
def fetch
|
@@ -39,19 +36,15 @@ module PgRls
|
|
39
36
|
nil
|
40
37
|
end
|
41
38
|
|
42
|
-
def
|
43
|
-
|
39
|
+
def fetch!
|
40
|
+
PgRls.main_model.find_by!(
|
44
41
|
tenant_id: PgRls.connection_class.connection.execute(
|
45
42
|
"SELECT current_setting('rls.tenant_id')"
|
46
43
|
).getvalue(0, 0)
|
47
44
|
)
|
48
45
|
end
|
49
|
-
alias fetch! tenant!
|
50
46
|
|
51
47
|
def reset_rls!
|
52
|
-
return if @tenant.blank?
|
53
|
-
|
54
|
-
@tenant = nil
|
55
48
|
PgRls.execute_rls_in_shards do |connection_class|
|
56
49
|
connection_class.transaction do
|
57
50
|
connection_class.connection.execute('RESET rls.tenant_id')
|
@@ -68,7 +61,7 @@ module PgRls
|
|
68
61
|
PgRls.main_model.ignored_columns = []
|
69
62
|
# rubocop: enable Rails/IgnoredColumnsAssignment
|
70
63
|
|
71
|
-
find_tenant(resource)
|
64
|
+
tenant = find_tenant(resource)
|
72
65
|
|
73
66
|
PgRls.execute_rls_in_shards do |connection_class|
|
74
67
|
connection_class.transaction do
|
@@ -78,6 +71,8 @@ module PgRls
|
|
78
71
|
end
|
79
72
|
|
80
73
|
tenant
|
74
|
+
rescue NoMethodError
|
75
|
+
raise PgRls::Errors::TenantNotFound
|
81
76
|
end
|
82
77
|
|
83
78
|
def find_tenant(resource)
|
@@ -85,14 +80,17 @@ module PgRls
|
|
85
80
|
|
86
81
|
reset_rls!
|
87
82
|
|
83
|
+
tenant = nil
|
84
|
+
|
88
85
|
PgRls.search_methods.each do |method|
|
89
|
-
break if
|
86
|
+
break if tenant.present?
|
90
87
|
|
91
|
-
|
92
|
-
@tenant = find_tenant_by_method(resource, method)
|
88
|
+
tenant = find_tenant_by_method(resource, method)
|
93
89
|
end
|
94
90
|
|
95
91
|
raise PgRls::Errors::TenantNotFound if tenant.blank?
|
92
|
+
|
93
|
+
tenant
|
96
94
|
end
|
97
95
|
|
98
96
|
def find_tenant_by_method(resource, method)
|
data/lib/pg_rls/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_rls
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Laloush
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -85,7 +85,7 @@ licenses:
|
|
85
85
|
- MIT
|
86
86
|
metadata:
|
87
87
|
rubygems_mfa_required: 'true'
|
88
|
-
post_install_message:
|
88
|
+
post_install_message:
|
89
89
|
rdoc_options: []
|
90
90
|
require_paths:
|
91
91
|
- lib
|
@@ -100,8 +100,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
100
|
- !ruby/object:Gem::Version
|
101
101
|
version: '0'
|
102
102
|
requirements: []
|
103
|
-
rubygems_version: 3.
|
104
|
-
signing_key:
|
103
|
+
rubygems_version: 3.3.7
|
104
|
+
signing_key:
|
105
105
|
specification_version: 4
|
106
106
|
summary: Write a short summary, because RubyGems requires one.
|
107
107
|
test_files: []
|