Sha256: 6f446fa974dd18e9ed2cbcbd7100ea1edf0b43c964b1040eab8bcc563680645f

Contents?: true

Size: 1.65 KB

Versions: 1

Compression:

Stored size: 1.65 KB

Contents

# frozen_string_literal: true

require 'active_support/concern'
require 'active_support/core_ext/string/inflections'

module SnFoil
  module Contexts
    module SetupContextConcern
      extend ActiveSupport::Concern

      class_methods do
        attr_reader :i_model, :i_policy

        def model(klass = nil)
          @i_model = klass
        end

        def policy(klass = nil)
          @i_policy = klass
        end
      end

      def model
        self.class.i_model
      end

      def policy
        self.class.i_policy
      end

      attr_reader :user
      def initialize(user = nil)
        @user = user
      end

      def authorize(object, action, **options)
        return unless user # Add logging

        lookup_policy(object, options).send(action)
      end

      def scope(object_class = nil, **options)
        object_class ||= model
        policy_name = lookup_policy(object_class, options).class.name
        "#{policy_name}::Scope".safe_constantize.new(wrap_object(object_class), user)
      end

      def wrap_object(object)
        return object unless adapter

        adapter.new(object)
      end

      def unwrap_object(object)
        return object unless adapter

        adapter?(object) ? object.__getobj__ : object
      end

      def adapter?(object)
        return false unless adapter

        object.instance_of? adapter
      end

      def adapter
        @adapter ||= SnFoil.adapter
      end

      private

      def lookup_policy(object, options)
        return options[:policy].new(user, object) if options[:policy]
        return policy.new(user, object) if policy

        Pundit.policy!(user, object)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
snfoil-0.1.0 lib/sn_foil/contexts/setup_context_concern.rb