Sha256: d54f3dfc442565c242c2edb4b15a1759e9b24faf5514ab9e68d0ffaa9397d0ea

Contents?: true

Size: 1.62 KB

Versions: 16

Compression:

Stored size: 1.62 KB

Contents

# Mixin for the {RailsOps::Operation} class that provides *policies*. Policies
# are simple blocks of code that run at specific places in your operation and
# can be used to check conditions such as params or permissions. Policies are
# inherited to subclasses of operations.
module RailsOps::Mixins::Policies
  extend ActiveSupport::Concern

  POLICY_CHAIN_KEYS = %i[
    on_init
    before_perform
    after_perform
    before_nested_model_ops
    before_model_save
  ].freeze

  included do
    class_attribute :_policy_chains
    self._policy_chains = POLICY_CHAIN_KEYS.map { |key| [key, [].freeze] }.to_h
  end

  module ClassMethods
    # Register a new policy block that will be executed in the given `chain`.
    # The policy block will be executed in the operation's instance context.
    def policy(chain = :before_perform, prepend_action: false, &block)
      unless POLICY_CHAIN_KEYS.include?(chain)
        fail "Unknown policy chain #{chain.inspect}, available are #{POLICY_CHAIN_KEYS.inspect}."
      end

      self._policy_chains = _policy_chains.dup
      if prepend_action
        _policy_chains[chain] = [block] + _policy_chains[chain]
      else
        _policy_chains[chain] += [block]
      end
    end

    # Returns all registered validation blocks for this operation class.
    def policies_for(chain)
      unless POLICY_CHAIN_KEYS.include?(chain)
        fail "Unknown policy chain #{chain.inspect}, available are #{POLICY_CHAIN_KEYS.inspect}."
      end

      return _policy_chains[chain]
    end
  end

  def run_policies(chain)
    self.class.policies_for(chain).each do |block|
      instance_eval(&block)
    end
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
rails_ops-1.6.0 lib/rails_ops/mixins/policies.rb
rails_ops-1.6.0.rc1 lib/rails_ops/mixins/policies.rb
rails_ops-1.6.0.rc0 lib/rails_ops/mixins/policies.rb
rails_ops-1.5.8 lib/rails_ops/mixins/policies.rb
rails_ops-1.5.7 lib/rails_ops/mixins/policies.rb
rails_ops-1.5.6 lib/rails_ops/mixins/policies.rb
rails_ops-1.5.5 lib/rails_ops/mixins/policies.rb
rails_ops-1.5.4 lib/rails_ops/mixins/policies.rb
rails_ops-1.5.0 lib/rails_ops/mixins/policies.rb
rails_ops-1.4.8 lib/rails_ops/mixins/policies.rb
rails_ops-1.4.7 lib/rails_ops/mixins/policies.rb
rails_ops-1.4.6 lib/rails_ops/mixins/policies.rb
rails_ops-1.4.5 lib/rails_ops/mixins/policies.rb
rails_ops-1.4.4 lib/rails_ops/mixins/policies.rb
rails_ops-1.4.3 lib/rails_ops/mixins/policies.rb
rails_ops-1.4.2 lib/rails_ops/mixins/policies.rb