Sha256: 8779a209ff24da5d9113693294c1f9bcabf5de3d056c51080192a6e28517dc56

Contents?: true

Size: 1.87 KB

Versions: 2

Compression:

Stored size: 1.87 KB

Contents

# frozen_string_literal: true

module SolidusActAsTenant
  # TenantAware automatically adds multi-tenant support to models
  # by adding tenant scoping and updating uniqueness validations to be tenant-aware.
  module TenantAware
    class << self
      def setup_tenant_aware_models
        tenant_aware_models = SolidusActAsTenant.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 = ::SolidusActAsTenant.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

      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(::SolidusActAsTenant.config.tenant_column_name)

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

      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
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
solidus_act_as_tenant-0.0.4 lib/solidus_act_as_tenant/tenant_aware.rb
solidus_act_as_tenant-0.0.3 lib/solidus_act_as_tenant/tenant_aware.rb