acts_as_multi_tenant 2.0.1 → 2.1.0
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c71beedb1daf50d84359687c3cd836db5a164b9155dec367cc7fa2603da30b3
|
4
|
+
data.tar.gz: d1e4917dd3aa6c00adacf881aba8f8416ced51e062ad3943b26d07e53e89dcd9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32e329436b4f368e8488552a82c50d16669212f43eebbf8728089e9b8104e72894251003c918dc1a66007761266366f29376c378d85a7cb0cd9076d18c8ce308
|
7
|
+
data.tar.gz: dc3529111832862ad25020c62a3be7574e4b372b554ba37c3f31609d88cc73db8b5c0426cf2a0a0b85e2bf54ddb3c661a44a1761037da5c4f6f430923999aaeb
|
data/lib/acts_as_multi_tenant.rb
CHANGED
@@ -8,4 +8,29 @@ require_relative 'multi_tenant/middleware'
|
|
8
8
|
|
9
9
|
module MultiTenant
|
10
10
|
NotImplemented = Class.new(StandardError)
|
11
|
+
|
12
|
+
class TenantsNotFound < RuntimeError
|
13
|
+
attr_reader :tenant_class
|
14
|
+
|
15
|
+
def initialize(tenant_class, identifiers, found_records)
|
16
|
+
@tenant_class = tenant_class
|
17
|
+
@identifiers = identifiers
|
18
|
+
@found_records = found_records
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns an array of the tenant identifiers that could not be found
|
22
|
+
def not_found
|
23
|
+
@not_found ||= @identifiers.map(&:to_s) - @found_records.map { |tenant|
|
24
|
+
tenant.send(@tenant_class.tenant_identifier).to_s
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
message
|
30
|
+
end
|
31
|
+
|
32
|
+
def message
|
33
|
+
"The following #{@tenant_class.name} tenants could not be found: #{not_found.join ", "}"
|
34
|
+
end
|
35
|
+
end
|
11
36
|
end
|
@@ -12,9 +12,10 @@ module MultiTenant
|
|
12
12
|
# @param using [String] (optional) column that contains the unique lookup identifier. Defaults to :code.
|
13
13
|
#
|
14
14
|
def acts_as_tenant(using: :code)
|
15
|
-
cattr_accessor :tenant_identifier, :tenant_thread_var
|
15
|
+
cattr_accessor :tenant_identifier, :tenant_thread_var, :raise_on_tenant_not_found
|
16
16
|
self.tenant_identifier = using
|
17
17
|
self.tenant_thread_var = "current_tenant_#{object_id}".freeze # allows there to be multiple tenant classes
|
18
|
+
self.raise_on_tenant_not_found = true
|
18
19
|
self.extend MultiTenant::ActsAsTenant::TenantGetters
|
19
20
|
self.extend MultiTenant::ActsAsTenant::TenantSetters
|
20
21
|
self.extend MultiTenant::ActsAsTenant::TenantHelpers
|
@@ -102,11 +103,15 @@ module MultiTenant
|
|
102
103
|
# @param records_or_identifiers array of the records or identifiers in the 'tenant_identifier' column.
|
103
104
|
#
|
104
105
|
def current_tenants=(records_or_identifiers)
|
105
|
-
records, identifiers = Array(records_or_identifiers).partition { |x|
|
106
|
+
records, identifiers = Array(records_or_identifiers.uniq).partition { |x|
|
106
107
|
x.class.respond_to?(:table_name) && x.class.table_name == self.table_name
|
107
108
|
}
|
108
109
|
tenants = if identifiers.any?
|
109
|
-
|
110
|
+
queried_records = where({tenant_identifier => identifiers}).to_a
|
111
|
+
if queried_records.size != identifiers.size and raise_on_tenant_not_found
|
112
|
+
raise ::MultiTenant::TenantsNotFound.new(self, identifiers, queried_records)
|
113
|
+
end
|
114
|
+
records + queried_records
|
110
115
|
else
|
111
116
|
records
|
112
117
|
end
|
@@ -96,6 +96,10 @@ module MultiTenant
|
|
96
96
|
ids = identifiers records_or_identifiers
|
97
97
|
return not_found.(id_resp.is_a?(Array) ? ids : ids[0])
|
98
98
|
end
|
99
|
+
|
100
|
+
rescue ::MultiTenant::TenantsNotFound => e
|
101
|
+
ids = e.not_found
|
102
|
+
not_found.(id_resp.is_a?(Array) ? ids : ids[0])
|
99
103
|
ensure
|
100
104
|
tenant_class.current = nil
|
101
105
|
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
module MultiTenant
|
2
|
+
# An exception indicating a tenant with a missing or invalid proxy identifier
|
3
|
+
NilProxyError = Class.new(RuntimeError)
|
4
|
+
|
2
5
|
#
|
3
6
|
# Helpers for setting a proxy model to your tenant model. So your records can `acts_as_tenant` to the proxy model instead of directly to the tenant.
|
4
7
|
#
|
@@ -84,7 +87,14 @@ module MultiTenant
|
|
84
87
|
def current_tenants
|
85
88
|
proxied_tenant_class
|
86
89
|
.current_tenants
|
87
|
-
.map
|
90
|
+
.map { |tenant|
|
91
|
+
if (proxy = tenant.send(proxied_tenant_inverse_assoc))
|
92
|
+
proxy
|
93
|
+
else
|
94
|
+
tenant_id = tenant.send(proxied_tenant_class.primary_key)
|
95
|
+
raise ::MultiTenant::NilProxyError, "Missing proxy for tenant #{proxied_tenant_class.name}##{tenant_id}"
|
96
|
+
end
|
97
|
+
}
|
88
98
|
end
|
89
99
|
end
|
90
100
|
|
data/lib/multi_tenant/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_multi_tenant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan Hollinger
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-
|
13
|
+
date: 2019-05-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
81
|
version: '0'
|
82
82
|
requirements: []
|
83
83
|
rubyforge_project:
|
84
|
-
rubygems_version: 2.7.6
|
84
|
+
rubygems_version: 2.7.6.2
|
85
85
|
signing_key:
|
86
86
|
specification_version: 4
|
87
87
|
summary: An ActiveRecord plugin for multi-tenant databases
|