Sha256: 91ce7ac930da2b6fe8c0695901ca25b263362af4aae98619adf820a1ce689a2c

Contents?: true

Size: 1.88 KB

Versions: 11

Compression:

Stored size: 1.88 KB

Contents

module Marty::Permissions
  # Make sure there are admin and user_manager roles,
  # even if hosting app doesn't define them
  REQ_ROLES = [:admin, :user_manager]
  ALL_ROLES = Rails.configuration.marty.roles.to_set.merge(REQ_ROLES)

  # Call using following format
  #   has_marty_permissions   create: [:dev, :admin],
  #                           read: :any,
  #                           update: :admin,
  #                           delete: []
  #
  # :any gives permission to the action if user belongs to at least 1 role
  def has_marty_permissions(attrs)
    raise 'bad attrs' unless attrs.is_a?(Hash)
    raise 'unknown role' unless
      attrs.values.flatten.to_set.subset? (ALL_ROLES << :any)

    define_singleton_method(:marty_permissions) { attrs }
  end

  def current_user_roles
    roles = Mcfly.whodunnit.roles rescue []
    roles.map { |r| r.name.to_sym }.to_set
  end

  def can_perform_action?(action)
    return false unless respond_to?(:marty_permissions)

    roles = current_user_roles
    roles = roles << :any if has_any_perm?

    aroles = marty_permissions[action.to_sym] || []
    # TODO: Use code below when switching to Ruby 2.1
    # Set[ *aroles].intersect? roles.to_set
    !(Set[*aroles] & roles.to_set).empty?
  end

  def can_perform_actions
    return [] unless respond_to?(:marty_permissions)

    roles = current_user_roles
    roles = roles << :any if has_any_perm?

    marty_permissions.map do |action, aroles|
      # TODO: Use code below when switching to Ruby 2.1
      # action if Set[ *aroles].intersect? roles.to_set
      action unless (Set[*aroles] & roles.to_set).empty?
    end.compact
  end

  # generate has_xxx_perm? methods for all permissions.
  Rails.configuration.marty.roles.each do |role|
    define_method("has_#{role}_perm?") do
      current_user_roles.member? role
    end
  end

  def has_any_perm?
    !(current_user_roles & ALL_ROLES).empty?
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
marty-2.6.4 lib/marty/permissions.rb
marty-2.6.3 lib/marty/permissions.rb
marty-2.6.2 lib/marty/permissions.rb
marty-2.6.1 lib/marty/permissions.rb
marty-2.6.0 lib/marty/permissions.rb
marty-2.5.9 lib/marty/permissions.rb
marty-2.5.8 lib/marty/permissions.rb
marty-2.5.7 lib/marty/permissions.rb
marty-2.5.6 lib/marty/permissions.rb
marty-2.5.5 lib/marty/permissions.rb
marty-2.5.4 lib/marty/permissions.rb