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
|
# File 'lib/appbase/model_concern.rb', line 22
def appbase_allow(crud, criteria=:mine, &block)
if [:create, :update, :delete, :query].index(crud).nil?
raise "Unsupported crud operation: #{crud}, available options: create, update, delete, query"
end
model = self
if criteria == :mine
AppBase::Engine.after_initialized do
user_identity_attr = "#{AppBase::Engine::UserIdentity.underscore}_id"
model.class_eval crud == :query ? %-
def self.accessible_by(user)
#{model.name}.where(:#{user_identity_attr} => user.id)
end
- : %-
def self.allow_#{crud}?(user, obj)
user.id == obj.#{user_identity_attr}
end
-
end
elsif crud != :query && criteria == :if && block_given? && block.parameters.count == 2
AppBase::Engine.after_initialized do
user_identity_attr = "#{AppBase::Engine::UserIdentity.underscore}_id"
model.define_singleton_method "allow_#{crud}".to_sym, &block
end
elsif crud == :query && criteria == :within && block_given? && block.parameters.count == 1
AppBase::Engine.after_initialized do
user_identity_attr = "#{AppBase::Engine::UserIdentity.underscore}_id"
model.define_singleton_method :accessible_by, &block
end
elsif crud != :query && riteria.instance_of?(Hash) && criteria.has_key?(:if) && criteria[:if].instance_of?(Symbol)
AppBase::Engine.after_initialized do
user_identity_attr = "#{AppBase::Engine::UserIdentity.underscore}_id"
model.class_eval %-
def self.allow_#{crud}?(user, obj)
#{model.name}.#{criteria[:if]} user
end
-
end
elsif crud == :query && criteria.instance_of?(Hash) && criteria.has_key?(:within) && criteria[:within].instance_of?(Symbol)
AppBase::Engine.after_initialized do
user_identity_attr = "#{AppBase::Engine::UserIdentity.underscore}_id"
model.class_eval %-
def self.accessible_by(user)
#{model.name}.#{criteria[:within]} user
end
-
end
else
raise %-
allow_#{crud} usage:
allow_#{crud} :mine
allow_#{crud} :#{ crud == :query ? 'within' : 'if' } => :a_singleton_method
allow_#{crud} :#{ crud == :query ? 'within' : 'if' } do |current_user_identity#{ crud == :query ? '' : ', model_instance' }|
# #{ crud == :query ? 'return fitlered query, e.g. Note.where(:user_id => current_user_identity.id)' : 'return true if allowed' }
end
-
end
AppBase::Registry.register_crud self, crud
end
|