Sha256: e05426168bcb0f2833a3208718c017e23d8f8d926aab63d4a67ed7297d840e30

Contents?: true

Size: 1.62 KB

Versions: 3

Compression:

Stored size: 1.62 KB

Contents

module Authz
  # An instance represents that a role has keyword for a particular scopable.
  # For example 'Sports Publisher' had keyword 'sports' for 'ScopableByDepartment'
  class ScopingRule < self::ApplicationRecord
    # Validations
    # ==========================================================================
    validates :scopable, presence: true
    validate :scopable_exists
    validates_uniqueness_of :scopable, scope: [:authz_role_id]
    validates :role, presence: true
    validates :keyword, presence: true
    validate :valid_keyword_for_scopable

    # Associations
    # ==========================================================================
    belongs_to :role, class_name: 'Authz::Role',
                      foreign_key: 'authz_role_id',
                      inverse_of: :scoping_rules,
                      touch: true

    has_many :role_grants, through: :role

    scope :for_scopables, ->(scopables) { where(scopable: scopables.map(&:to_s)) }

    # @return [String] string representation of instance
    def to_s
      "#{scopable}: #{keyword}##{id}"
    end

    private

    def scopable_exists
      unless scopable_exists?(scopable)
        errors.add(:scopable, "#{scopable} does not exists.")
      end
    end

    def valid_keyword_for_scopable
      if  scopable_exists?(scopable) && !scopable.constantize.valid_keyword?(keyword)
        errors.add(:keyword, "#{keyword} is not a valid keyword for #{scopable}")
      end
    end

    # Used to reduce the impact of the external dependency Scopable::Base
    def scopable_exists?(scopable)
      Scopables::Base.scopable_exists?(scopable)
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
authz-0.0.5 app/models/authz/scoping_rule.rb
authz-0.0.4 app/models/authz/scoping_rule.rb
authz-0.0.3 app/models/authz/scoping_rule.rb