module Monarchy::ActsAsHierarchy::SupportMethods

Public Instance Methods

accessible_for_options(options = {}) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 90
def accessible_for_options(options = {})
  Monarchy.configuration.accessible_for_options.to_h.merge(options)
end
accessible_leaves_ids(user_id, inherited_roles = []) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 84
def accessible_leaves_ids(user_id, inherited_roles = [])
  ancestor_leaves_for_user(user_id, false)
    .select('monarchy_hierarchy_hierarchies.ancestor_id AS id')
    .union_all(descendant_leaves_for_user(user_id, inherited_roles)).select(:id)
end
accessible_roots_ids(user_id, parent_access) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 72
def accessible_roots_ids(user_id, parent_access)
  user_query = sanitize_sql_for_assignment(['INNER JOIN (SELECT hierarchy_id FROM monarchy_members ' \
    'WHERE monarchy_members.user_id = ?) as members ON ' \
      'members.hierarchy_id = monarchy_hierarchy_hierarchies.descendant_id', user_id])

  accessible_roots = unscoped.joins('INNER JOIN monarchy_hierarchy_hierarchies ON ' \
    'monarchy_hierarchies.id = monarchy_hierarchy_hierarchies.ancestor_id')
                             .joins(user_query).select(:id)

  parent_access ? roots_with_children(accessible_roots) : accessible_roots
end

Private Instance Methods

ancestor_leaves_for_user(user_id, inherited, inherited_roles = []) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 135
def ancestor_leaves_for_user(user_id, inherited, inherited_roles = [])
  user_query = sanitize_sql_for_assignment(['INNER JOIN (SELECT id, hierarchy_id FROM monarchy_members WHERE ' \
    'user_id = ?) as monarchy_members ON monarchy_members.hierarchy_id = monarchy_hierarchies.id', user_id])

  unscoped
    .joins('INNER JOIN monarchy_hierarchy_hierarchies ON ' \
      'monarchy_hierarchies.id = monarchy_hierarchy_hierarchies.descendant_id')
    .joins(user_query)
    .joins('INNER JOIN monarchy_members_roles ON monarchy_members_roles.member_id = monarchy_members.id')
    .joins("INNER JOIN (#{inheritance_query(inherited_roles, inherited)}) as " \
      'monarchy_roles ON monarchy_members_roles.role_id = monarchy_roles.id')
end
descendant_leaves_for_user(user_id, inherited_roles = []) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 128
def descendant_leaves_for_user(user_id, inherited_roles = [])
  ancestor_leaves_for_user(user_id, true, inherited_roles)
    .joins('INNER JOIN monarchy_hierarchy_hierarchies AS monarchy_descendants ON ' \
      'monarchy_descendants.ancestor_id = monarchy_hierarchies.id')
    .select('monarchy_descendants.descendant_id AS id')
end
include_relations() click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 96
def include_relations
  belongs_to :resource, polymorphic: true
  has_many :members, class_name: "::#{Monarchy.member_class}", dependent: :destroy
  has_many :users, through: :members, class_name: "::#{Monarchy.user_class}"
end
include_scopes() click to toggle source

rubocop:disable all

# File lib/monarchy/acts_as_hierarchy.rb, line 108
def include_scopes
  scope :in, (lambda do |hierarchy, descendants = true|
    where(id: descendants ? descendants_for(hierarchy) : children_for(hierarchy))
  end)

  scope :accessible_for, (lambda do |user, options = {}|
    user_id = user.id

    custom_options = accessible_for_options(options)
    where(id: accessible_roots_ids(user_id, custom_options[:parent_access])
         .union_all(accessible_leaves_ids(user_id, custom_options[:inherited_roles])))
  end)
end
include_validators() click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 102
def include_validators
  validates :resource_type, presence: true
  validates :resource_id, uniqueness: { scope: [:resource_type] }, presence: true
end
inheritance_query(inherited_roles, inherited) click to toggle source
# File lib/monarchy/acts_as_hierarchy.rb, line 148
def inheritance_query(inherited_roles, inherited)
  if inherited_roles.present?
    Monarchy.role_class.select(:id, :inherited, :name)
            .where('inherited = ? OR name IN (?)', inherited, inherited_roles).to_sql
  else
    Monarchy.role_class.select(:id, :inherited).where(inherited: inherited).to_sql
  end
end
roots_with_children(accessible_roots) click to toggle source

rubocop:enable all

# File lib/monarchy/acts_as_hierarchy.rb, line 123
def roots_with_children(accessible_roots)
  accessible_children = unscoped.where(parent_id: accessible_roots).select(:id)
  accessible_roots.union_all(accessible_children)
end