monarchy 2.0.7 → 2.0.8

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: 387d2b45a06426e506849cb93e65233de8eb28f2
4
- data.tar.gz: 7d5bc881940cb9b75831e01fee258a30409bd277
3
+ metadata.gz: 9a877a7ac740060484a3f64d5d0f9fbb7fcf310b
4
+ data.tar.gz: f26a5bd2af7906227bb78e9a35937e9bfd2ebe4a
5
5
  SHA512:
6
- metadata.gz: d3254e9c61cce95221d874bbce2b4f62857f504ba0442f079a24e59d1f37b75f97121482cc2806ee89e9563a6ad8d064b3597a16399312d393c8d3ca34549975
7
- data.tar.gz: 791954cbe20ab2d4bbb7ac3c9ebd0a26d1ca7252a8a5e5b265cbfd65303b94adfbe86ee18950c9862a6e43883d98be1b2253819cc46d8b021eb8d2d94ddb14aa
6
+ metadata.gz: 8727e6be4d706c8117fc1dae73f19bff9cab7e57269c2c85e942f14b4dbf7e9e761a065ecd8d031fe13c39ce1b6961073dd8e4d6e4937e2c558253bc910668e0
7
+ data.tar.gz: 2fd0924823fba6765740c972246a1db28cb358be122c290a28957451b85bc886e306ad89d1c6797436f0a74e763de5f0c70255fb10fdcf0b6dce8c84974c1b8f
@@ -1 +1 @@
1
- future-release=2.0.7
1
+ future-release=2.0.8
data/CHANGELOG.md CHANGED
@@ -1,7 +1,14 @@
1
1
  # Change Log
2
2
 
3
- ## [2.0.7](https://github.com/Exelord/Monarchy/tree/2.0.7) (2017-01-09)
4
- [Full Changelog](https://github.com/Exelord/Monarchy/compare/v2.0.6...2.0.7)
3
+ ## [2.0.8](https://github.com/Exelord/Monarchy/tree/2.0.8) (2017-01-12)
4
+ [Full Changelog](https://github.com/Exelord/Monarchy/compare/v2.0.7...2.0.8)
5
+
6
+ **Merged pull requests:**
7
+
8
+ - Feature parent access [\#67](https://github.com/Exelord/Monarchy/pull/67) ([Exelord](https://github.com/Exelord))
9
+
10
+ ## [v2.0.7](https://github.com/Exelord/Monarchy/tree/v2.0.7) (2017-01-09)
11
+ [Full Changelog](https://github.com/Exelord/Monarchy/compare/v2.0.6...v2.0.7)
5
12
 
6
13
  **Merged pull requests:**
7
14
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- monarchy (2.0.7)
4
+ monarchy (2.0.8)
5
5
  active_record_union (= 1.2.0)
6
6
  activerecord (>= 4.2.7.1)
7
7
  closure_tree (= 6.2.0)
@@ -74,7 +74,7 @@ GEM
74
74
  globalid (0.3.7)
75
75
  activesupport (>= 4.1.0)
76
76
  i18n (0.7.0)
77
- json (2.0.2)
77
+ json (2.0.3)
78
78
  loofah (2.0.3)
79
79
  nokogiri (>= 1.5.9)
80
80
  mail (2.6.4)
@@ -16,9 +16,27 @@ You can select all hierarchies accessible for specific user by using a scope: `a
16
16
  ``` ruby
17
17
  Monarchy.hierarchy_class.accessible_for(current_user) # returns [hierarchy1, hierarchy2, hierarchy5]
18
18
  ```
19
+
20
+ #### Options
19
21
  Optionally you can pass extra allowed roles which should be inherited for this request
20
22
  ``` ruby
21
- Monarchy.hierarchy_class.accessible_for(current_user, [:blocked, :visitors]) # returns [hierarchy1, hierarchy2, hierarchy5, hierarchy6]
23
+ Monarchy.hierarchy_class.accessible_for(current_user, { inherited_roles: [:blocked, :visitors] }) # returns [hierarchy1, hierarchy2, hierarchy5, hierarchy6]
24
+ ```
25
+
26
+ You can also determine if read (default role) access in resource should allow to access theirs children
27
+
28
+ ```ruby
29
+ Monarchy.hierarchy_class.accessible_for(current_user, { parent_access: true })
30
+ # (GRANTED) hierarchy1
31
+ # |
32
+ # |
33
+ # (GRANTED) hierarchy2 hierarchy4 (GRANTED cuz it's a parent of granted resource)
34
+ # | |
35
+ # | |
36
+ # | hierarchy5 (NOT granted - it's not a child of granted resource)
37
+ # |
38
+ # |
39
+ # hierarchy3 (member role - GRANTED)
22
40
  ```
23
41
 
24
42
  ### .in(resource, true)
@@ -69,11 +69,29 @@ You can select all resources accessible for specyfic user by using scope: `acces
69
69
  ``` ruby
70
70
  Resource.accessible_for(current_user) # returns [resource1, resource2, resource5]
71
71
  ```
72
+
73
+ #### Options
72
74
  Optionally you can pass extra allowed roles which should be inherited for this request
73
75
  ``` ruby
74
76
  Resource.accessible_for(current_user, [:blocked, :visitors]) # returns [resource1, resource2, resource5, resource6]
75
77
  ```
76
78
 
79
+ You can also determine if read (default role) access in resource should allow to access theirs children
80
+
81
+ ```ruby
82
+ Resource.accessible_for(current_user, { parent_access: true })
83
+ # (GRANTED) project1
84
+ # |
85
+ # |
86
+ # (GRANTED) project2 project4 (GRANTED cuz it's a parent of granted resource)
87
+ # | |
88
+ # | |
89
+ # | project5 (NOT granted - it's not a child of granted resource)
90
+ # |
91
+ # |
92
+ # project3 (member role - GRANTED)
93
+ ```
94
+
77
95
  ### .in(resource, true)
78
96
  You can select all resources scoped into another by using scope: `in`:
79
97
 
data/dummy/db/schema.rb CHANGED
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  # This file is auto-generated from the current state of the database. Instead
3
2
  # of editing this file, please use the migrations feature of Active Record to
4
3
  # incrementally modify your database, and then regenerate this schema definition.
@@ -26,41 +25,37 @@ ActiveRecord::Schema.define(version: 20160818205534) do
26
25
  t.string "resource_type", null: false
27
26
  t.datetime "created_at", null: false
28
27
  t.datetime "updated_at", null: false
28
+ t.index ["parent_id"], name: "index_monarchy_hierarchies_on_parent_id"
29
+ t.index ["resource_id"], name: "index_monarchy_hierarchies_on_resource_id"
29
30
  end
30
31
 
31
- add_index "monarchy_hierarchies", ["parent_id"], name: "index_monarchy_hierarchies_on_parent_id"
32
- add_index "monarchy_hierarchies", ["resource_id"], name: "index_monarchy_hierarchies_on_resource_id"
33
-
34
32
  create_table "monarchy_hierarchy_hierarchies", id: false, force: :cascade do |t|
35
33
  t.integer "ancestor_id", null: false
36
34
  t.integer "descendant_id", null: false
37
35
  t.integer "generations", null: false
36
+ t.index ["ancestor_id", "descendant_id", "generations"], name: "hierarchy_anc_desc_idx", unique: true
37
+ t.index ["descendant_id"], name: "hierarchy_desc_idx"
38
38
  end
39
39
 
40
- add_index "monarchy_hierarchy_hierarchies", ["ancestor_id", "descendant_id", "generations"], name: "hierarchy_anc_desc_idx", unique: true
41
- add_index "monarchy_hierarchy_hierarchies", ["descendant_id"], name: "hierarchy_desc_idx"
42
-
43
40
  create_table "monarchy_members", force: :cascade do |t|
44
41
  t.integer "user_id"
45
42
  t.integer "hierarchy_id"
46
43
  t.datetime "created_at", null: false
47
44
  t.datetime "updated_at", null: false
45
+ t.index ["hierarchy_id"], name: "index_monarchy_members_on_hierarchy_id"
46
+ t.index ["user_id"], name: "index_monarchy_members_on_user_id"
48
47
  end
49
48
 
50
- add_index "monarchy_members", ["hierarchy_id"], name: "index_monarchy_members_on_hierarchy_id"
51
- add_index "monarchy_members", ["user_id"], name: "index_monarchy_members_on_user_id"
52
-
53
49
  create_table "monarchy_members_roles", force: :cascade do |t|
54
50
  t.integer "role_id"
55
51
  t.integer "member_id"
56
52
  t.datetime "created_at", null: false
57
53
  t.datetime "updated_at", null: false
54
+ t.index ["member_id"], name: "index_monarchy_members_roles_on_member_id"
55
+ t.index ["role_id", "member_id"], name: "index_monarchy_members_roles_on_role_id_and_member_id", unique: true
56
+ t.index ["role_id"], name: "index_monarchy_members_roles_on_role_id"
58
57
  end
59
58
 
60
- add_index "monarchy_members_roles", ["member_id"], name: "index_monarchy_members_roles_on_member_id"
61
- add_index "monarchy_members_roles", ["role_id", "member_id"], name: "index_monarchy_members_roles_on_role_id_and_member_id", unique: true
62
- add_index "monarchy_members_roles", ["role_id"], name: "index_monarchy_members_roles_on_role_id"
63
-
64
59
  create_table "monarchy_roles", force: :cascade do |t|
65
60
  t.string "name", null: false
66
61
  t.integer "level", default: 0, null: false
@@ -68,13 +63,12 @@ ActiveRecord::Schema.define(version: 20160818205534) do
68
63
  t.boolean "inherited", default: false, null: false
69
64
  t.datetime "created_at", null: false
70
65
  t.datetime "updated_at", null: false
66
+ t.index ["inherited"], name: "index_monarchy_roles_on_inherited"
67
+ t.index ["inherited_role_id"], name: "index_monarchy_roles_on_inherited_role_id"
68
+ t.index ["level"], name: "index_monarchy_roles_on_level"
69
+ t.index ["name"], name: "index_monarchy_roles_on_name", unique: true
71
70
  end
72
71
 
73
- add_index "monarchy_roles", ["inherited"], name: "index_monarchy_roles_on_inherited"
74
- add_index "monarchy_roles", ["inherited_role_id"], name: "index_monarchy_roles_on_inherited_role_id"
75
- add_index "monarchy_roles", ["level"], name: "index_monarchy_roles_on_level"
76
- add_index "monarchy_roles", ["name"], name: "index_monarchy_roles_on_name", unique: true
77
-
78
72
  create_table "projects", force: :cascade do |t|
79
73
  t.string "name"
80
74
  t.datetime "created_at", null: false
@@ -23,25 +23,37 @@ module Monarchy
23
23
  module SupportMethods
24
24
  private
25
25
 
26
+ # rubocop:disable all
26
27
  def include_scopes
27
28
  scope :in, (lambda do |hierarchy, descendants = true|
28
29
  Monarchy::Validators.hierarchy(hierarchy)
29
30
  where(id: descendants ? hierarchy.descendants : hierarchy.children)
30
31
  end)
31
32
 
32
- scope :accessible_for, (lambda do |user, inherited_roles = []|
33
+ scope :accessible_for, (lambda do |user, options = {}|
33
34
  Monarchy::Validators.user(user)
34
35
  user_id = user.id
35
- where(id: accessible_roots_ids(user_id).union_all(accessible_leaves_ids(user_id, inherited_roles)))
36
+
37
+ custom_options = accessible_for_options(options)
38
+ where(id: accessible_roots_ids(user_id, custom_options[:parent_access])
39
+ .union_all(accessible_leaves_ids(user_id, custom_options[:inherited_roles])))
36
40
  end)
37
41
  end
42
+ # rubocop:enable all
38
43
 
39
- def accessible_roots_ids(user_id)
40
- unscoped.joins('INNER JOIN monarchy_hierarchy_hierarchies ON ' \
44
+ def accessible_roots_ids(user_id, parent_access)
45
+ accessible_roots = unscoped.joins('INNER JOIN monarchy_hierarchy_hierarchies ON ' \
41
46
  'monarchy_hierarchies.id = monarchy_hierarchy_hierarchies.ancestor_id')
42
- .joins('INNER JOIN (SELECT hierarchy_id FROM monarchy_members ' \
47
+ .joins('INNER JOIN (SELECT hierarchy_id FROM monarchy_members ' \
43
48
  "WHERE monarchy_members.user_id = #{user_id}) as members ON " \
44
49
  'members.hierarchy_id = monarchy_hierarchy_hierarchies.descendant_id').select(:id)
50
+
51
+ parent_access ? roots_with_children(accessible_roots) : accessible_roots
52
+ end
53
+
54
+ def roots_with_children(accessible_roots)
55
+ accessible_children = unscoped.where(parent_id: accessible_roots).select(:id)
56
+ accessible_roots.union_all(accessible_children)
45
57
  end
46
58
 
47
59
  def accessible_leaves_ids(user_id, inherited_roles = [])
@@ -76,6 +88,10 @@ module Monarchy
76
88
  Monarchy.role_class.select(:id, :inherited).where(inherited: inherited).to_sql
77
89
  end
78
90
  end
91
+
92
+ def accessible_for_options(options = {})
93
+ Monarchy.configuration.accessible_for_options.to_h.merge(options)
94
+ end
79
95
  end
80
96
  end
81
97
  end
@@ -51,9 +51,9 @@ module Monarchy
51
51
  joins(:hierarchy).where(monarchy_hierarchies: { id: hierarchies })
52
52
  end)
53
53
 
54
- scope :accessible_for, (lambda do |user, inherited_roles = []|
54
+ scope :accessible_for, (lambda do |user, options = {}|
55
55
  joins(:hierarchy).where(monarchy_hierarchies: { id: Monarchy.hierarchy_class
56
- .accessible_for(user, inherited_roles) })
56
+ .accessible_for(user, options) })
57
57
  end)
58
58
  end
59
59
 
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Monarchy
3
- VERSION = '2.0.7'
3
+ VERSION = '2.0.8'
4
4
  end
data/lib/monarchy.rb CHANGED
@@ -29,6 +29,8 @@ module Monarchy
29
29
  config.hierarchy_class_name = 'Monarchy::Hierarchy'
30
30
  config.members_access_revoke = false
31
31
  config.revoke_strategy = :revoke_member
32
+ config.accessible_for_options.parent_access = false
33
+ config.accessible_for_options.inherited_roles = []
32
34
  end
33
35
 
34
36
  not_configured do |property|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: monarchy
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.7
4
+ version: 2.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Exelord
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-09 00:00:00.000000000 Z
11
+ date: 2017-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord