/
roles_mask.rb
executable file
·84 lines (69 loc) · 1.95 KB
/
roles_mask.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
module RoleStrategy::ActiveRecord
module RolesMask
def self.default_role_attribute
:roles_mask
end
def self.included base
base.extend ClassMethods
end
module ClassMethods
def role_attribute
strategy_class.roles_attribute_name.to_sym
end
def in_role(role)
mask = calc_index(role.to_s)
all.select do |user|
(user.send(role_attribute) & mask) > 0
end
end
def in_roles(*roles)
all.select do |user|
roles.flatten.any? do |role|
mask = calc_index(role.to_s)
(user.send(role_attribute) & mask) > 0
end
end
end
def calc_index(r)
2**strategy_class.valid_roles.index(r.to_sym)
end
end
module Implementation
class Roles < ::Set # :nodoc:
attr_reader :model_instance
def initialize(sender, *roles)
super(*roles)
@model_instance = sender
end
def <<(role)
model_instance.roles = super.to_a
self
end
end
def role_attribute
strategy_class.roles_attribute_name
end
# assign roles
def roles=(*roles)
the_roles = (roles.flatten.map { |r| r.to_sym } & strategy_class.valid_roles)
value = the_roles.map{ |r| calc_index(r) }.inject{ |sum, bitvalue| sum + bitvalue }
puts "value: #{value}"
self.send "#{role_attribute}=", value
end
alias_method :role=, :roles=
# query assigned roles
def roles
strategy_class::Roles.new(self, strategy_class.valid_roles.reject { |r| ((self.send(role_attribute) || 0) & calc_index(r)).zero? })
end
def roles_list
roles.to_a
end
protected
def calc_index(r)
2**strategy_class.valid_roles.index(r)
end
end
extend Roles::Generic::User::Configuration
configure
end
end