Module: SolidusActsAsTenant::TenantAware

Defined in:
lib/solidus_acts_as_tenant/tenant_aware.rb

Overview

TenantAware automatically adds multi-tenant support to models by adding tenant scoping and updating uniqueness validations to be tenant-aware.

Class Method Summary collapse

Class Method Details

.remove_existing_validation(base, attribute) ⇒ Object



40
41
42
43
44
45
46
47
48
# File 'lib/solidus_acts_as_tenant/tenant_aware.rb', line 40

def remove_existing_validation(base, attribute)
  base._validators[attribute].reject! { _1.kind == :uniqueness }
  base._validate_callbacks.each do |callback|
    next unless callback.filter.try(:attributes)&.include?(attribute) &&
                callback.filter.kind == :uniqueness

    callback.filter.attributes.delete(attribute)
  end
end

.setup_tenant_aware_modelsObject



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/solidus_acts_as_tenant/tenant_aware.rb', line 8

def setup_tenant_aware_models
  tenant_aware_models = SolidusActsAsTenant.config.tenant_aware_models || []

  tenant_aware_models.each do |klass, validator_attributes|
    Module.new do
      @validator_attributes = validator_attributes
      define_singleton_method(:prepended) do |base|
        options = ::SolidusActsAsTenant.config.acts_as_tenant_args
        base.acts_as_tenant(*options[0..-2], **options.last)

        @validator_attributes&.each do |attribute|
          TenantAware.update_uniqueness_validation(base, attribute)
        end
      end

      klass.constantize.prepend(self)
    end
  end
end

.update_uniqueness_validation(base, attribute) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/solidus_acts_as_tenant/tenant_aware.rb', line 28

def update_uniqueness_validation(base, attribute)
  attribute = attribute.to_sym
  validator = base._validators[attribute].find { _1.kind == :uniqueness }
  raise "No uniqueness validator found for #{attribute} on #{base}" unless validator

  new_options = validator.options.dup
  new_options[:scope] = Array(new_options[:scope]).push(::SolidusActsAsTenant.config.tenant_column_name)

  remove_existing_validation(base, attribute)
  base.validates_uniqueness_of attribute, **new_options
end