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.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +55 -17
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.md +19 -2
  5. data/CODE_OF_CONDUCT.md +77 -29
  6. data/Guardfile +44 -0
  7. data/README.md +247 -83
  8. data/Rakefile +5 -12
  9. data/Steepfile +29 -0
  10. data/UPGRADE.md +106 -0
  11. data/app/models/pg_rls/admin.rb +24 -0
  12. data/app/models/pg_rls/current.rb +48 -0
  13. data/app/models/pg_rls/record.rb +13 -0
  14. data/app/models/pg_rls/tenant/searchable.rb +60 -0
  15. data/app/models/pg_rls/tenant/securable.rb +67 -0
  16. data/app/models/pg_rls/tenant/switchable.rb +40 -0
  17. data/app/models/pg_rls/tenant.rb +9 -0
  18. data/assets/logo.svg +8 -0
  19. data/docker-compose.yml +14 -0
  20. data/lib/generators/pg_rls/active_record/active_record_generator.rb +62 -65
  21. data/lib/generators/pg_rls/install/install_generator.rb +38 -0
  22. data/lib/generators/pg_rls/pg_rls_generator.rb +2 -1
  23. data/lib/generators/pg_rls/templates/USAGE +28 -0
  24. data/lib/generators/pg_rls/{active_record/templates → templates/app/models}/abstract_base_class.rb.tt +1 -3
  25. data/lib/generators/pg_rls/{active_record/templates → templates/app/models}/model.rb.tt +0 -2
  26. data/lib/generators/pg_rls/templates/config/initializers/pg_rls.rb.tt +58 -0
  27. data/lib/generators/pg_rls/templates/db/migrate/backport_pg_rls_table.rb.tt +14 -0
  28. data/lib/generators/pg_rls/templates/db/migrate/convert_to_pg_rls_table.rb.tt +5 -0
  29. data/lib/generators/pg_rls/templates/db/migrate/convert_to_pg_rls_tenant_table.rb.tt +5 -0
  30. data/lib/generators/pg_rls/templates/db/migrate/create_pg_rls_table.rb.tt +29 -0
  31. data/lib/generators/pg_rls/templates/db/migrate/create_pg_rls_tenant_table.rb.tt +29 -0
  32. data/lib/pg_rls/active_record/connection_adapters/connection_pool.rb +31 -0
  33. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/check_rls_user_privileges.rb +207 -0
  34. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/errors.rb +17 -0
  35. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/grant_rls_user_privileges.rb +167 -0
  36. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/rls_functions.rb +91 -0
  37. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/rls_policies.rb +56 -0
  38. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/rls_triggers.rb +95 -0
  39. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/rls_user_statements.rb +127 -0
  40. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/schema_dumper.rb +71 -0
  41. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/schema_statements.rb +120 -0
  42. data/lib/pg_rls/active_record/connection_adapters/postgre_sql/sql_helper_method.rb +30 -0
  43. data/lib/pg_rls/active_record/connection_adapters/postgre_sql.rb +36 -0
  44. data/lib/pg_rls/active_record/connection_adapters.rb +12 -0
  45. data/lib/pg_rls/active_record/database_shards.rb +74 -0
  46. data/lib/pg_rls/active_record/migration/command_recorder.rb +28 -0
  47. data/lib/pg_rls/active_record/migration.rb +11 -0
  48. data/lib/pg_rls/active_record/test_databases.rb +19 -0
  49. data/lib/pg_rls/active_record.rb +11 -0
  50. data/lib/pg_rls/active_support/string_ext.rb +17 -0
  51. data/lib/pg_rls/active_support.rb +9 -0
  52. data/lib/pg_rls/connection_config.rb +61 -0
  53. data/lib/pg_rls/deprecation.rb +14 -0
  54. data/lib/pg_rls/engine.rb +8 -0
  55. data/lib/pg_rls/error.rb +10 -0
  56. data/lib/pg_rls/generators/.keep +0 -0
  57. data/lib/pg_rls/railtie.rb +1 -11
  58. data/lib/pg_rls/tasks/.keep +0 -0
  59. data/lib/pg_rls/version.rb +3 -1
  60. data/lib/pg_rls.rb +67 -151
  61. data/rbs_collection.lock.yaml +132 -0
  62. data/rbs_collection.yaml +127 -0
  63. data/review_code.sh +33 -0
  64. data/sig/generators/pg_rls/active_record/active_record_generator.rbs +43 -0
  65. data/sig/generators/pg_rls/install/install_generator.rbs +20 -0
  66. data/sig/generators/pg_rls/pg_rls_generator.rbs +9 -0
  67. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/check_rls_user_privileges.rbs +53 -0
  68. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/errors.rbs +24 -0
  69. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/grant_rls_user_privileges.rbs +55 -0
  70. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/rls_functions.rbs +31 -0
  71. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/rls_policies.rbs +28 -0
  72. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/rls_triggers.rbs +35 -0
  73. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/rls_user_statements.rbs +48 -0
  74. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/schema_dumper.rbs +38 -0
  75. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/schema_statements.rbs +67 -0
  76. data/sig/pg_rls/active_record/connection_adapters/postgre_sql/sql_helper_method.rbs +21 -0
  77. data/sig/pg_rls/active_record/connection_adapters/postgresql.rbs +10 -0
  78. data/sig/pg_rls/active_record/connection_adapters.rbs +50 -0
  79. data/sig/pg_rls/active_record/database_shards.rbs +34 -0
  80. data/sig/pg_rls/active_record/migration/command_recorder.rbs +14 -0
  81. data/sig/pg_rls/active_record/migration.rbs +8 -0
  82. data/sig/pg_rls/active_record.rbs +7 -0
  83. data/sig/pg_rls/active_support/hash_ext.rbs +11 -0
  84. data/sig/pg_rls/active_support/string_ext.rbs +27 -0
  85. data/sig/pg_rls/active_support.rbs +7 -0
  86. data/sig/pg_rls/app/models/pg_rls/record.rbs +4 -0
  87. data/sig/pg_rls/connection_config.rbs +16 -0
  88. data/sig/pg_rls/deprecation.rbs +9 -0
  89. data/sig/pg_rls/engine.rbs +7 -0
  90. data/sig/pg_rls/errors.rbs +14 -0
  91. data/sig/pg_rls/railtie.rbs +6 -0
  92. data/sig/pg_rls/tenant_test_helper.rbs +14 -0
  93. data/sig/pg_rls.rbs +60 -0
  94. data/sig/support/active_record.rbs +86 -0
  95. data/sig/support/active_support.rbs +7 -0
  96. data/sig/support/fowardable.rbs +2 -0
  97. data/sig/support/pg.rbs +12 -0
  98. data/sig/support/rails.rbs +38 -0
  99. data/start.sh +30 -0
  100. metadata +167 -48
  101. data/.rspec +0 -3
  102. data/Gemfile +0 -21
  103. data/Gemfile.lock +0 -300
  104. data/LICENSE.txt +0 -21
  105. data/bin/console +0 -15
  106. data/bin/setup +0 -8
  107. data/lib/generators/pg_rls/active_record/templates/convert_migration.rb.tt +0 -11
  108. data/lib/generators/pg_rls/active_record/templates/convert_migration_backport.rb.tt +0 -12
  109. data/lib/generators/pg_rls/active_record/templates/init_convert_migration.rb.tt +0 -11
  110. data/lib/generators/pg_rls/active_record/templates/init_migration.rb.tt +0 -25
  111. data/lib/generators/pg_rls/active_record/templates/init_model.rb.tt +0 -24
  112. data/lib/generators/pg_rls/active_record/templates/migration.rb.tt +0 -17
  113. data/lib/generators/pg_rls/base.rb +0 -36
  114. data/lib/generators/pg_rls/install_generator.rb +0 -90
  115. data/lib/generators/pg_rls.rb +0 -19
  116. data/lib/generators/templates/README +0 -22
  117. data/lib/generators/templates/pg_rls.rb.tt +0 -48
  118. data/lib/pg_rls/Rakefile +0 -7
  119. data/lib/pg_rls/current/context.rb +0 -10
  120. data/lib/pg_rls/database/admin_statements.rb +0 -28
  121. data/lib/pg_rls/database/configurations.rb +0 -46
  122. data/lib/pg_rls/database/prepared.rb +0 -40
  123. data/lib/pg_rls/database/tasks/admin_database.rake +0 -40
  124. data/lib/pg_rls/errors/index.rb +0 -4
  125. data/lib/pg_rls/errors/rake_only_error.rb +0 -12
  126. data/lib/pg_rls/errors/tenant_not_found.rb +0 -13
  127. data/lib/pg_rls/logger.rb +0 -31
  128. data/lib/pg_rls/middleware/set_reset_connection.rb +0 -93
  129. data/lib/pg_rls/middleware/sidekiq/client.rb +0 -22
  130. data/lib/pg_rls/middleware/sidekiq/server.rb +0 -19
  131. data/lib/pg_rls/middleware/sidekiq.rb +0 -11
  132. data/lib/pg_rls/middleware.rb +0 -8
  133. data/lib/pg_rls/multi_tenancy.rb +0 -32
  134. data/lib/pg_rls/schema/down_statements.rb +0 -54
  135. data/lib/pg_rls/schema/dumper.rb +0 -36
  136. data/lib/pg_rls/schema/statements.rb +0 -72
  137. data/lib/pg_rls/schema/up_statements.rb +0 -104
  138. 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