Sha256: a9cf850e58fb518ff0e4c2cf25e88321964c51c019f6eb6b2e1ebd359ba9aa69

Contents?: true

Size: 1.22 KB

Versions: 1

Compression:

Stored size: 1.22 KB

Contents

# frozen_string_literal: true

module Pragma
  module Macro
    def self.Policy(name: :default, action: nil)
      step = ->(input, options) { Policy.for(input, name, options, action) }
      [step, name: "policy.#{name}"]
    end

    module Policy
      class << self
        def for(input, name, options, action = nil)
          klass = Macro.require_skill('Policy', "policy.#{name}.class", options)

          policy = klass.new(
            options['policy.context'] || options['current_user'],
            options['model']
          )

          action_name = action.is_a?(Proc) ? action.call(options) : action
          action_name ||= input.class.operation_name

          options["result.policy.#{name}"] = Trailblazer::Operation::Result.new(
            policy.send("#{action_name}?"),
            'policy' => policy
          )

          unless options["result.policy.#{name}"].success?
            handle_unauthorized!(options)
            return false
          end

          true
        end

        private

        def handle_unauthorized!(options)
          options['result.response'] = Pragma::Operation::Response::Forbidden.new.decorate_with(
            Pragma::Decorator::Error
          )
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pragma-2.5.0 lib/pragma/macro/policy.rb