pg_rls 0.2.5 → 1.0.1
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/.rubocop.yml +55 -17
- data/.ruby-version +1 -0
- data/CHANGELOG.md +19 -2
- data/CODE_OF_CONDUCT.md +77 -29
- data/Guardfile +44 -0
- data/README.md +247 -83
- data/Rakefile +5 -12
- data/Steepfile +29 -0
- data/UPGRADE.md +106 -0
- data/app/models/pg_rls/admin.rb +24 -0
- data/app/models/pg_rls/current.rb +48 -0
- data/app/models/pg_rls/record.rb +13 -0
- data/app/models/pg_rls/tenant/searchable.rb +60 -0
- data/app/models/pg_rls/tenant/securable.rb +67 -0
- data/app/models/pg_rls/tenant/switchable.rb +40 -0
- data/app/models/pg_rls/tenant.rb +9 -0
- data/assets/logo.svg +8 -0
- data/docker-compose.yml +14 -0
- data/lib/generators/pg_rls/active_record/active_record_generator.rb +62 -65
- data/lib/generators/pg_rls/install/install_generator.rb +38 -0
- data/lib/generators/pg_rls/pg_rls_generator.rb +2 -1
- data/lib/generators/pg_rls/templates/USAGE +28 -0
- data/lib/generators/pg_rls/{active_record/templates → templates/app/models}/abstract_base_class.rb.tt +1 -3
- data/lib/generators/pg_rls/{active_record/templates → templates/app/models}/model.rb.tt +0 -2
- data/lib/generators/pg_rls/templates/config/initializers/pg_rls.rb.tt +58 -0
- data/lib/generators/pg_rls/templates/db/migrate/backport_pg_rls_table.rb.tt +14 -0
- data/lib/generators/pg_rls/templates/db/migrate/convert_to_pg_rls_table.rb.tt +5 -0
- data/lib/generators/pg_rls/templates/db/migrate/convert_to_pg_rls_tenant_table.rb.tt +5 -0
- data/lib/generators/pg_rls/templates/db/migrate/create_pg_rls_table.rb.tt +29 -0
- data/lib/generators/pg_rls/templates/db/migrate/create_pg_rls_tenant_table.rb.tt +29 -0
- data/lib/pg_rls/active_record/connection_adapters/connection_pool.rb +31 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/check_rls_user_privileges.rb +207 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/errors.rb +17 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/grant_rls_user_privileges.rb +167 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/rls_functions.rb +91 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/rls_policies.rb +56 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/rls_triggers.rb +95 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/rls_user_statements.rb +127 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/schema_dumper.rb +71 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/schema_statements.rb +120 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql/sql_helper_method.rb +30 -0
- data/lib/pg_rls/active_record/connection_adapters/postgre_sql.rb +36 -0
- data/lib/pg_rls/active_record/connection_adapters.rb +12 -0
- data/lib/pg_rls/active_record/database_shards.rb +74 -0
- data/lib/pg_rls/active_record/migration/command_recorder.rb +28 -0
- data/lib/pg_rls/active_record/migration.rb +11 -0
- data/lib/pg_rls/active_record/test_databases.rb +19 -0
- data/lib/pg_rls/active_record.rb +11 -0
- data/lib/pg_rls/active_support/string_ext.rb +17 -0
- data/lib/pg_rls/active_support.rb +9 -0
- data/lib/pg_rls/connection_config.rb +61 -0
- data/lib/pg_rls/deprecation.rb +14 -0
- data/lib/pg_rls/engine.rb +8 -0
- data/lib/pg_rls/error.rb +10 -0
- data/lib/pg_rls/generators/.keep +0 -0
- data/lib/pg_rls/railtie.rb +1 -11
- data/lib/pg_rls/tasks/.keep +0 -0
- data/lib/pg_rls/version.rb +3 -1
- data/lib/pg_rls.rb +67 -151
- data/rbs_collection.lock.yaml +132 -0
- data/rbs_collection.yaml +127 -0
- data/review_code.sh +33 -0
- data/sig/generators/pg_rls/active_record/active_record_generator.rbs +43 -0
- data/sig/generators/pg_rls/install/install_generator.rbs +20 -0
- data/sig/generators/pg_rls/pg_rls_generator.rbs +9 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/check_rls_user_privileges.rbs +53 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/errors.rbs +24 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/grant_rls_user_privileges.rbs +55 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/rls_functions.rbs +31 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/rls_policies.rbs +28 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/rls_triggers.rbs +35 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/rls_user_statements.rbs +48 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/schema_dumper.rbs +38 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/schema_statements.rbs +67 -0
- data/sig/pg_rls/active_record/connection_adapters/postgre_sql/sql_helper_method.rbs +21 -0
- data/sig/pg_rls/active_record/connection_adapters/postgresql.rbs +10 -0
- data/sig/pg_rls/active_record/connection_adapters.rbs +50 -0
- data/sig/pg_rls/active_record/database_shards.rbs +34 -0
- data/sig/pg_rls/active_record/migration/command_recorder.rbs +14 -0
- data/sig/pg_rls/active_record/migration.rbs +8 -0
- data/sig/pg_rls/active_record.rbs +7 -0
- data/sig/pg_rls/active_support/hash_ext.rbs +11 -0
- data/sig/pg_rls/active_support/string_ext.rbs +27 -0
- data/sig/pg_rls/active_support.rbs +7 -0
- data/sig/pg_rls/app/models/pg_rls/record.rbs +4 -0
- data/sig/pg_rls/connection_config.rbs +16 -0
- data/sig/pg_rls/deprecation.rbs +9 -0
- data/sig/pg_rls/engine.rbs +7 -0
- data/sig/pg_rls/errors.rbs +14 -0
- data/sig/pg_rls/railtie.rbs +6 -0
- data/sig/pg_rls/tenant_test_helper.rbs +14 -0
- data/sig/pg_rls.rbs +60 -0
- data/sig/support/active_record.rbs +86 -0
- data/sig/support/active_support.rbs +7 -0
- data/sig/support/fowardable.rbs +2 -0
- data/sig/support/pg.rbs +12 -0
- data/sig/support/rails.rbs +38 -0
- data/start.sh +30 -0
- metadata +167 -48
- data/.rspec +0 -3
- data/Gemfile +0 -21
- data/Gemfile.lock +0 -300
- data/LICENSE.txt +0 -21
- data/bin/console +0 -15
- data/bin/setup +0 -8
- data/lib/generators/pg_rls/active_record/templates/convert_migration.rb.tt +0 -11
- data/lib/generators/pg_rls/active_record/templates/convert_migration_backport.rb.tt +0 -12
- data/lib/generators/pg_rls/active_record/templates/init_convert_migration.rb.tt +0 -11
- data/lib/generators/pg_rls/active_record/templates/init_migration.rb.tt +0 -25
- data/lib/generators/pg_rls/active_record/templates/init_model.rb.tt +0 -24
- data/lib/generators/pg_rls/active_record/templates/migration.rb.tt +0 -17
- data/lib/generators/pg_rls/base.rb +0 -36
- data/lib/generators/pg_rls/install_generator.rb +0 -90
- data/lib/generators/pg_rls.rb +0 -19
- data/lib/generators/templates/README +0 -22
- data/lib/generators/templates/pg_rls.rb.tt +0 -48
- data/lib/pg_rls/Rakefile +0 -7
- data/lib/pg_rls/current/context.rb +0 -10
- data/lib/pg_rls/database/admin_statements.rb +0 -28
- data/lib/pg_rls/database/configurations.rb +0 -46
- data/lib/pg_rls/database/prepared.rb +0 -40
- data/lib/pg_rls/database/tasks/admin_database.rake +0 -40
- data/lib/pg_rls/errors/index.rb +0 -4
- data/lib/pg_rls/errors/rake_only_error.rb +0 -12
- data/lib/pg_rls/errors/tenant_not_found.rb +0 -13
- data/lib/pg_rls/logger.rb +0 -31
- data/lib/pg_rls/middleware/set_reset_connection.rb +0 -93
- data/lib/pg_rls/middleware/sidekiq/client.rb +0 -22
- data/lib/pg_rls/middleware/sidekiq/server.rb +0 -19
- data/lib/pg_rls/middleware/sidekiq.rb +0 -11
- data/lib/pg_rls/middleware.rb +0 -8
- data/lib/pg_rls/multi_tenancy.rb +0 -32
- data/lib/pg_rls/schema/down_statements.rb +0 -54
- data/lib/pg_rls/schema/dumper.rb +0 -36
- data/lib/pg_rls/schema/statements.rb +0 -72
- data/lib/pg_rls/schema/up_statements.rb +0 -104
- data/lib/pg_rls/tenant.rb +0 -153
data/lib/pg_rls/tenant.rb
DELETED
@@ -1,153 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module PgRls
|
4
|
-
# Tenant Controller
|
5
|
-
module Tenant
|
6
|
-
class << self
|
7
|
-
def switch(resource)
|
8
|
-
switch!(resource)
|
9
|
-
rescue PgRls::Errors::TenantNotFound
|
10
|
-
nil
|
11
|
-
end
|
12
|
-
|
13
|
-
def switch!(resource)
|
14
|
-
tenant = switch_tenant!(resource)
|
15
|
-
|
16
|
-
"RLS changed to '#{tenant.id}'"
|
17
|
-
rescue StandardError
|
18
|
-
Rails.logger.info('connection was not made')
|
19
|
-
raise PgRls::Errors::TenantNotFound
|
20
|
-
end
|
21
|
-
|
22
|
-
def with_tenant!(resource)
|
23
|
-
PgRls.main_model.connection_pool.with_connection do
|
24
|
-
tenant = switch_tenant!(resource)
|
25
|
-
|
26
|
-
yield(tenant).presence if block_given?
|
27
|
-
ensure
|
28
|
-
reset_rls! unless PgRls.test_inline_tenant == true || PgRls::Current::Context.tenant.blank?
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def fetch
|
33
|
-
fetch!
|
34
|
-
rescue ActiveRecord::StatementInvalid, ActiveRecord::RecordNotFound
|
35
|
-
nil
|
36
|
-
end
|
37
|
-
|
38
|
-
def fetch!
|
39
|
-
PgRls::Current::Context.tenant ||= PgRls.main_model.connection_pool.with_connection do |connection|
|
40
|
-
tenant_id = get_tenant_id(connection)
|
41
|
-
if tenant_id.present?
|
42
|
-
PgRls.main_model.find_by!(
|
43
|
-
tenant_id:
|
44
|
-
)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# rubocop:disable Lint/RescueStandardError
|
50
|
-
# rubocop:disable Lint/UselessAssignment
|
51
|
-
def get_tenant_id(connection)
|
52
|
-
connection.execute("SELECT current_setting('rls.tenant_id')").getvalue(0, 0)
|
53
|
-
rescue => e
|
54
|
-
nil
|
55
|
-
end
|
56
|
-
# rubocop:enable Lint/RescueStandardError
|
57
|
-
# rubocop:enable Lint/UselessAssignment
|
58
|
-
|
59
|
-
def reset_rls!
|
60
|
-
PgRls.execute_rls_in_shards do |connection_class|
|
61
|
-
connection_class.connection_pool.with_connection do |connection|
|
62
|
-
connection.transaction do
|
63
|
-
connection.execute('RESET rls.tenant_id')
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
PgRls::Current::Context.clear_all
|
69
|
-
nil
|
70
|
-
end
|
71
|
-
|
72
|
-
def set_rls!(tenant)
|
73
|
-
tenant_id = tenant.tenant_id
|
74
|
-
PgRls.execute_rls_in_shards do |connection_class|
|
75
|
-
connection_class.connection_pool.with_connection do |connection|
|
76
|
-
connection.transaction do
|
77
|
-
connection.execute(format('SET rls.tenant_id = %s',
|
78
|
-
connection.quote(tenant_id)))
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
PgRls::Current::Context.clear_all
|
83
|
-
PgRls::Current::Context.tenant = tenant
|
84
|
-
end
|
85
|
-
|
86
|
-
def on_find_each(ids: [], scope: nil, &)
|
87
|
-
raise 'Invalid Scope' if scope.present? && PgRls.main_model != scope.klass
|
88
|
-
|
89
|
-
result = []
|
90
|
-
|
91
|
-
query = build_on_each_query(ids, scope)
|
92
|
-
|
93
|
-
query.find_each do |tenant|
|
94
|
-
result << { tenant_id: tenant.id, result: with_tenant!(tenant, &) }
|
95
|
-
end
|
96
|
-
|
97
|
-
result
|
98
|
-
end
|
99
|
-
|
100
|
-
private
|
101
|
-
|
102
|
-
def build_on_each_query(ids, scope)
|
103
|
-
return PgRls.main_model.all if ids.empty? && scope.blank?
|
104
|
-
|
105
|
-
return PgRls.main_model.where(id: ids) if scope.blank?
|
106
|
-
|
107
|
-
return scope.where(id: ids) if ids.present?
|
108
|
-
|
109
|
-
scope
|
110
|
-
end
|
111
|
-
|
112
|
-
def switch_tenant!(resource)
|
113
|
-
tenant = find_tenant(resource)
|
114
|
-
|
115
|
-
PgRls.establish_new_connection! if PgRls.admin_connection?
|
116
|
-
set_rls!(tenant)
|
117
|
-
|
118
|
-
tenant
|
119
|
-
rescue NoMethodError
|
120
|
-
raise PgRls::Errors::TenantNotFound
|
121
|
-
ensure
|
122
|
-
reset_rls! if tenant.blank?
|
123
|
-
end
|
124
|
-
|
125
|
-
def find_tenant(resource)
|
126
|
-
tenant = nil
|
127
|
-
|
128
|
-
PgRls.search_methods.each do |method|
|
129
|
-
break if tenant.present?
|
130
|
-
|
131
|
-
tenant = find_tenant_by_method(resource, method)
|
132
|
-
end
|
133
|
-
|
134
|
-
reset_rls! if reset_rls?(tenant)
|
135
|
-
raise PgRls::Errors::TenantNotFound if tenant.blank?
|
136
|
-
|
137
|
-
tenant
|
138
|
-
end
|
139
|
-
|
140
|
-
def reset_rls?(tenant)
|
141
|
-
PgRls::Current::Context.tenant.present? && tenant.present? && PgRls::Current::Context.tenant != tenant
|
142
|
-
end
|
143
|
-
|
144
|
-
def find_tenant_by_method(resource, method)
|
145
|
-
return resource if resource.is_a?(PgRls.main_model)
|
146
|
-
|
147
|
-
PgRls.main_model.unscoped.send(:"find_by_#{method}!", resource)
|
148
|
-
rescue ActiveRecord::RecordNotFound
|
149
|
-
nil
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|