Sha256: 9952f3bfe555cf2f83be2671ae52dd5aee7a8c87b8dce0f6a14c85195c23efd7

Contents?: true

Size: 1.98 KB

Versions: 6

Compression:

Stored size: 1.98 KB

Contents

# frozen_string_literal: true
module Monarchy
  module ActsAsMember
    extend ActiveSupport::Concern

    module ClassMethods
      def acts_as_member
        extend Monarchy::ActsAsMember::SupportMethods

        self.table_name = 'monarchy_members'

        delegate :resource, :resource_id, :resource_type, to: :hierarchy

        include_relationships
        include_validators
        include_callbacks
        include_scopes

        include Monarchy::ActsAsMember::InstanceMethods
      end
    end

    module SupportMethods
      def include_scopes
        scope :accessible_for, (lambda do |user|
          Monarchy::Validators.user(user)
          where(hierarchy: Monarchy.hierarchy_class.accessible_for(user))
        end)
      end

      def include_callbacks
        after_destroy :revoke_access, if: :members_access_revoke?
      end

      def include_validators
        validates :user_id, uniqueness: { scope: :hierarchy_id }
        validates :user, presence: true
        validate :hierarchy_or_resource
      end

      def include_relationships
        has_many :members_roles, dependent: :destroy, class_name: 'Monarchy::MembersRole'
        has_many :roles, -> { order(level: :desc) }, through: :members_roles, class_name: "::#{Monarchy.role_class}"

        belongs_to :user, class_name: "::#{Monarchy.user_class}"
        belongs_to :hierarchy, class_name: "::#{Monarchy.hierarchy_class}"
      end
    end

    module InstanceMethods
      def resource=(resource)
        Monarchy::Validators.resource(resource)
        self.hierarchy = resource.hierarchy unless hierarchy
      end

      private

      def revoke_access
        user.revoke_access(resource, resource.hierarchy.descendants)
      end

      def members_access_revoke?
        Monarchy.configuration.members_access_revoke
      end

      def hierarchy_or_resource
        errors.add(:base, 'Specify a resource or a hierarchy') unless hierarchy
      end
    end
  end
end

ActiveRecord::Base.send :include, Monarchy::ActsAsMember

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
monarchy-2.0.8 lib/monarchy/acts_as_member.rb
monarchy-2.0.7 lib/monarchy/acts_as_member.rb
monarchy-2.0.6 lib/monarchy/acts_as_member.rb
monarchy-2.0.5 lib/monarchy/acts_as_member.rb
monarchy-2.0.4 lib/monarchy/acts_as_member.rb
monarchy-2.0.0.pre.beta.1 lib/monarchy/acts_as_member.rb