Sha256: 36c460af76bda40b86707df54c882de1d8170186e4ee767fd4afdf51f19401e3

Contents?: true

Size: 1.86 KB

Versions: 1

Compression:

Stored size: 1.86 KB

Contents

module Allowance
  class Permissions
    def initialize(context, &blk)
      @permissions = {}
      @context = context
      instance_exec(context, &blk)
    end

    def can?(*args)
      if ![Symbol, Class].include?(args.last.class)
        thing = args.pop
        args.push(thing.class)
      end

      if (p = find_permission(*args)).present?
        thing ? scoped_model(*args).find(:first, conditions: { id: thing.id }).present? : true
      else
        false
      end
    end

    def can(*args)
      options = args.pop if args.last.is_a?(Hash) || args.last.is_a?(Proc)
      object  = args.pop unless args.last.is_a?(Symbol)

      expand_permissions(args).each do |verb|
        permissions[permission_identifier(verb, object)] ||= options || true
      end
    end

    def scoped_model(*args)
      model = args.last  # TODO: check that model is a class

      if p = find_permission(*args)
        if p.is_a?(Hash)
          model.where(p)
        elsif p.is_a?(Proc)
          (p.arity == 0 ? model.instance_exec(&p) : model.call(r))
        else
          model
        end
      else
        model.where(false)
      end
    end

    def find_permission(*args)
      object  = args.pop unless args.last.is_a?(Symbol)

      args.flatten.each do |verb|
        if p = permissions[permission_identifier(verb, object)]
          return p
        end
      end
      nil
    end

  private

    def expand_permissions(*permissions)
      permissions.flatten.map do |p|
        case p
          when :manage then [:manage, :index, :show, :new, :create, :edit, :update, :destroy]
          when :view   then [:view, :index, :show]
          else p
        end
      end.flatten
    end

    def permission_identifier(verb, object)
      raise "Can't use enumerables as verbs" if verb.is_a?(Enumerable)
      [verb.to_sym, object].compact
    end

    attr_reader :permissions
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
allowance-0.0.1 lib/allowance/permissions.rb