module Authorization::Maintenance::Usage

Module for grouping usage-related helper methods

Public Class Methods

usages_by_controller() click to toggle source

Delivers a hash of {ControllerClass => usage_info_hash}, where usage_info_hash has the form of

# File lib/declarative_authorization/maintenance.rb, line 55
def self.usages_by_controller
  # load each application controller
  begin
    Dir.glob(File.join(::Rails.root, 'app', 'controllers', '**', '*_controller\.rb')) do |entry|
      require entry
    end
  rescue Errno::ENOENT
  end
  controllers = ObjectSpace.each_object(Class).select do |obj|
    obj.ancestors.include?(ActionController::Base) &&
      obj != ActionController::Base &&
      (!obj.name || obj.name.demodulize != 'ApplicationController')
  end

  controllers.inject({}) do |memo, controller|
    catchall_permissions = []
    permission_by_action = {}
    controller.all_filter_access_permissions.each do |controller_permissions|
      catchall_permissions << controller_permissions if controller_permissions.actions.include?(:all)
      controller_permissions.actions.reject {|action| action == :all}.each do |action|
        permission_by_action[action] = controller_permissions
      end
    end

    actions = controller.public_instance_methods(false) - controller.hidden_actions.to_a
    memo[controller] = actions.inject({}) do |actions_memo, action|
      action_sym = action.to_sym
      actions_memo[action_sym] =
        if permission_by_action[action_sym]
          {
            :privilege => permission_by_action[action_sym].privilege,
            :context   => permission_by_action[action_sym].context,
            :controller_permissions => [permission_by_action[action_sym]]
          }
        elsif !catchall_permissions.empty?
          {
            :privilege => catchall_permissions[0].privilege,
            :context   => catchall_permissions[0].context,
            :controller_permissions => catchall_permissions
          }
        else
          {}
        end
      actions_memo
    end
    memo
  end
end