mongoid_ability 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e8efe06a6a08b5f7d80532153f9324597c3a932
|
4
|
+
data.tar.gz: e77cc428a3509f03cca38a40b9a25155d3cd3539
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddef2f4d29749491c06f0dd21601fa509208808c2542b87eade4eb73fb91644b0500aabd9eccf30e6b8bb150cad60101b88d34d0ed1b6a3f994cc55706f623c2
|
7
|
+
data.tar.gz: d774fe84fded69148b77b5edddfcc21fed50371159dfc8454b58f916f0d1e2c5a5eddc9f87a4859235c52d15ece619966f1af1bbfbca1197e6cc91d11b6d7e11
|
data/lib/mongoid_ability.rb
CHANGED
@@ -11,6 +11,7 @@ require "mongoid_ability/resolve_default_locks"
|
|
11
11
|
require "mongoid_ability/resolve_inherited_locks"
|
12
12
|
require "mongoid_ability/resolve_owner_locks"
|
13
13
|
|
14
|
+
require "mongoid_ability/values_for_accessible_query"
|
14
15
|
require "mongoid_ability/accessible_query_builder"
|
15
16
|
|
16
17
|
# ---------------------------------------------------------------------
|
@@ -6,80 +6,42 @@ module MongoidAbility
|
|
6
6
|
|
7
7
|
# =====================================================================
|
8
8
|
|
9
|
-
# TODO: cleanup
|
10
9
|
def call
|
11
|
-
|
12
|
-
|
13
|
-
closed_ids = [] # [id]
|
14
|
-
|
15
|
-
base_class_and_descendants.each do |cls|
|
16
|
-
closed_classes << cls.to_s if ability.cannot?(action, cls, options)
|
17
|
-
|
18
|
-
id_locks(cls).each do |lock|
|
19
|
-
if ability.can?(action, cls.new(_id: lock.subject_id), options)
|
20
|
-
open_ids << [cls.to_s, lock.subject_id]
|
21
|
-
else
|
22
|
-
closed_ids << lock.subject_id
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
closed_classes_condition = { :_type.nin => closed_classes }
|
28
|
-
open_ids_condition = { :_type.in => open_ids.map(&:first), :_id.in => open_ids.map(&:last) }
|
29
|
-
closed_ids_condition = { :_id.nin => closed_ids }
|
30
|
-
or_conditions = [ closed_classes_condition, open_ids_condition ].reject(&:blank?)
|
31
|
-
|
32
|
-
base_criteria.where( :$and => [ { :$or => or_conditions }, closed_ids_condition ])
|
10
|
+
or_conditions = [closed_types_condition, open_ids_condition].reject(&:blank?)
|
11
|
+
base_class.criteria.where(:$and => [{ :$or => or_conditions }, closed_ids_condition])
|
33
12
|
end
|
34
13
|
|
35
14
|
private # =============================================================
|
36
15
|
|
37
|
-
def
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
# ---------------------------------------------------------------------
|
42
|
-
|
43
|
-
def base_class_superclass
|
44
|
-
@base_class_superclass ||= (base_class.ancestors_with_default_locks.last || base_class)
|
16
|
+
def closed_types_condition
|
17
|
+
{ :_type.nin => values.closed_types }
|
45
18
|
end
|
46
19
|
|
47
|
-
def
|
48
|
-
|
20
|
+
def open_ids_condition
|
21
|
+
{
|
22
|
+
:_type.in => values.open_types_and_ids.map(&:type),
|
23
|
+
:_id.in => values.open_types_and_ids.map(&:id)
|
24
|
+
}
|
49
25
|
end
|
50
26
|
|
51
|
-
def
|
52
|
-
|
27
|
+
def closed_ids_condition
|
28
|
+
{ :_id.nin => values.closed_ids }
|
53
29
|
end
|
54
30
|
|
55
31
|
# ---------------------------------------------------------------------
|
56
32
|
|
57
|
-
def
|
58
|
-
@
|
59
|
-
end
|
60
|
-
|
61
|
-
def inherited_from_relation
|
62
|
-
return unless owner.respond_to?(owner.class.inherit_from_relation_name)
|
63
|
-
owner.inherit_from_relation
|
33
|
+
def values
|
34
|
+
@values ||= MongoidAbility::ValuesForAccessibleQuery.call(base_class, ability, action, options)
|
64
35
|
end
|
65
36
|
|
66
37
|
# ---------------------------------------------------------------------
|
67
38
|
|
68
|
-
def
|
69
|
-
(
|
70
|
-
end
|
71
|
-
|
72
|
-
def owner_id_locks_for_subject_type(cls)
|
73
|
-
@owner_id_locks_for_subject_type ||= {}
|
74
|
-
@owner_id_locks_for_subject_type[cls] ||= owner.locks_relation.id_locks.for_action(action).for_subject_type(cls.to_s)
|
39
|
+
def base_class_superclass
|
40
|
+
@base_class_superclass ||= (base_class.ancestors_with_default_locks.last || base_class)
|
75
41
|
end
|
76
42
|
|
77
|
-
def
|
78
|
-
|
79
|
-
@inherited_from_relation_ids_locks_for_subject_type ||= {}
|
80
|
-
@inherited_from_relation_ids_locks_for_subject_type[cls] ||= inherited_from_relation.collect do |o|
|
81
|
-
o.locks_relation.id_locks.for_action(action).for_subject_type(cls.to_s)
|
82
|
-
end.flatten
|
43
|
+
def default_lock(_cls, action)
|
44
|
+
base_class_superclass.default_locks.detect { |l| l.action.to_s == action.to_s }
|
83
45
|
end
|
84
46
|
end
|
85
47
|
end
|
data/lib/mongoid_ability/lock.rb
CHANGED
@@ -18,7 +18,12 @@ module MongoidAbility
|
|
18
18
|
scope :for_action, -> (action) { where(action: action.to_sym) }
|
19
19
|
|
20
20
|
scope :for_subject_type, -> (subject_type) { where(subject_type: subject_type.to_s) }
|
21
|
-
|
21
|
+
|
22
|
+
scope :for_subject_id, -> (subject_id) {
|
23
|
+
return where(subject_id: nil) unless subject_id.present?
|
24
|
+
where(subject_id: BSON::ObjectId.from_string(subject_id))
|
25
|
+
}
|
26
|
+
|
22
27
|
scope :for_subject, -> (subject) {
|
23
28
|
return where(subject_id: nil) unless subject.present?
|
24
29
|
where(subject_type: subject.class.model_name, subject_id: subject.id)
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module MongoidAbility
|
2
|
+
class ValuesForAccessibleQuery < Struct.new(:base_class, :ability, :action, :options)
|
3
|
+
def self.call(*args)
|
4
|
+
new(*args).call
|
5
|
+
end
|
6
|
+
|
7
|
+
# =====================================================================
|
8
|
+
|
9
|
+
def call
|
10
|
+
closed_types = [] # [cls]
|
11
|
+
open_types_and_ids = [] # OpenStruct.new(type: …, id: …)
|
12
|
+
closed_ids = [] # [id]
|
13
|
+
|
14
|
+
base_class_and_descendants.each do |cls|
|
15
|
+
closed_types << cls.to_s if ability.cannot?(action, cls, options)
|
16
|
+
id_locks(cls).each do |lock|
|
17
|
+
if ability.can?(action, cls.new(_id: lock.subject_id), options)
|
18
|
+
open_types_and_ids << OpenStruct.new(type: cls.to_s, id: lock.subject_id)
|
19
|
+
else
|
20
|
+
closed_ids << lock.subject_id
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
OpenStruct.new(
|
26
|
+
closed_types: closed_types,
|
27
|
+
open_types_and_ids: open_types_and_ids,
|
28
|
+
closed_ids: closed_ids
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
private # =============================================================
|
33
|
+
|
34
|
+
def base_class_and_descendants
|
35
|
+
@base_class_and_descendants ||= [base_class].concat(base_class.descendants)
|
36
|
+
end
|
37
|
+
|
38
|
+
# ---------------------------------------------------------------------
|
39
|
+
|
40
|
+
def id_locks(cls)
|
41
|
+
(Array(owner_id_locks_for_subject_type(cls)) + Array(inherited_from_relation_ids_locks_for_subject_type(cls))).flatten
|
42
|
+
end
|
43
|
+
|
44
|
+
def owner_id_locks_for_subject_type(cls)
|
45
|
+
@owner_id_locks_for_subject_type ||= {}
|
46
|
+
@owner_id_locks_for_subject_type[cls] ||= owner.locks_relation.id_locks.for_action(action).for_subject_type(cls.to_s)
|
47
|
+
end
|
48
|
+
|
49
|
+
def inherited_from_relation_ids_locks_for_subject_type(cls)
|
50
|
+
return [] unless inherited_from_relation
|
51
|
+
@inherited_from_relation_ids_locks_for_subject_type ||= {}
|
52
|
+
@inherited_from_relation_ids_locks_for_subject_type[cls] ||= inherited_from_relation.collect do |o|
|
53
|
+
o.locks_relation.id_locks.for_action(action).for_subject_type(cls.to_s)
|
54
|
+
end.flatten
|
55
|
+
end
|
56
|
+
|
57
|
+
# ---------------------------------------------------------------------
|
58
|
+
|
59
|
+
def owner
|
60
|
+
@owner ||= ability.owner
|
61
|
+
end
|
62
|
+
|
63
|
+
# ---------------------------------------------------------------------
|
64
|
+
|
65
|
+
def inherited_from_relation
|
66
|
+
return unless owner.respond_to?(owner.class.inherit_from_relation_name)
|
67
|
+
owner.inherit_from_relation
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_ability
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomáš Celizna
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cancancan
|
@@ -162,6 +162,7 @@ files:
|
|
162
162
|
- lib/mongoid_ability/resolve_locks.rb
|
163
163
|
- lib/mongoid_ability/resolve_owner_locks.rb
|
164
164
|
- lib/mongoid_ability/subject.rb
|
165
|
+
- lib/mongoid_ability/values_for_accessible_query.rb
|
165
166
|
- lib/mongoid_ability/version.rb
|
166
167
|
- mongoid_ability.gemspec
|
167
168
|
- test/mongoid_ability/ability_role_test.rb
|