Skip to content

Commit c2e9104

Browse files
authored
fix: stats permissions should be retrieved only one time per team (#489)
* fix: stats permissions should be retrieved only one time per team
1 parent bd4afa5 commit c2e9104

File tree

3 files changed

+29
-18
lines changed

3 files changed

+29
-18
lines changed

app/services/forest_liana/permissions_checker.rb

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module ForestLiana
22
class PermissionsChecker
33
@@permissions_cached = Hash.new
4-
@@scopes_cached = Hash.new
4+
@@renderings_cached = Hash.new
55
@@roles_acl_activated = false
66
# TODO: handle cache scopes per rendering
77
@@expiration_in_seconds = (ENV['FOREST_PERMISSIONS_EXPIRATION_IN_SECONDS'] || 3600).to_i
@@ -39,13 +39,16 @@ def fetch_permissions
3939
permissions['data'] = ForestLiana::PermissionsFormatter.convert_to_new_format(permissions['data'], @rendering_id)
4040
@@permissions_cached[@rendering_id] = permissions
4141
end
42+
43+
# NOTICE: Add stats permissions to the RenderingPermissions
44+
permissions['data']['renderings'][@rendering_id]['stats'] = permissions['stats']
4245
add_scopes_to_cache(permissions)
4346
end
4447

4548
def add_scopes_to_cache(permissions)
4649
permissions['data']['renderings'].keys.each { |rendering_id|
47-
@@scopes_cached[rendering_id] = permissions['data']['renderings'][rendering_id]
48-
@@scopes_cached[rendering_id]['last_fetch'] = Time.now
50+
@@renderings_cached[rendering_id] = permissions['data']['renderings'][rendering_id]
51+
@@renderings_cached[rendering_id]['last_fetch'] = Time.now
4952
} if permissions['data']['renderings']
5053
end
5154

@@ -59,8 +62,6 @@ def is_allowed
5962
return stat_with_parameters_allowed?
6063
end
6164

62-
63-
6465
if permissions && permissions[@collection_name] &&
6566
permissions[@collection_name]['collection']
6667
if @permission_name === 'actions'
@@ -83,21 +84,25 @@ def is_allowed
8384
end
8485

8586
def get_scope_in_permissions
86-
@@scopes_cached[@rendering_id] &&
87-
@@scopes_cached[@rendering_id][@collection_name] &&
88-
@@scopes_cached[@rendering_id][@collection_name]['scope']
87+
@@renderings_cached[@rendering_id] &&
88+
@@renderings_cached[@rendering_id][@collection_name] &&
89+
@@renderings_cached[@rendering_id][@collection_name]['scope']
8990
end
9091

9192
def scope_cache_expired?
92-
return true unless @@scopes_cached[@rendering_id] && @@scopes_cached[@rendering_id]['last_fetch']
93+
return true unless @@renderings_cached[@rendering_id] && @@renderings_cached[@rendering_id]['last_fetch']
9394

94-
elapsed_seconds = date_difference_in_seconds(Time.now, @@scopes_cached[@rendering_id]['last_fetch'])
95+
elapsed_seconds = date_difference_in_seconds(Time.now, @@renderings_cached[@rendering_id]['last_fetch'])
9596
elapsed_seconds >= @@expiration_in_seconds
9697
end
9798

9899
# This will happen only on rolesACLActivated (as scope cache will always be up to date on disabled)
99100
def refresh_scope_cache
100101
permissions = ForestLiana::PermissionsGetter::get_permissions_for_rendering(@rendering_id, rendering_specific_only: true)
102+
103+
# NOTICE: Add stats permissions to the RenderingPermissions
104+
permissions['data']['renderings'][@rendering_id]['stats'] = permissions['stats']
105+
101106
add_scopes_to_cache(permissions)
102107
end
103108

@@ -112,12 +117,12 @@ def get_permissions_content
112117
end
113118

114119
def get_live_query_permissions_content
115-
permissions = get_permissions
120+
permissions = @@renderings_cached[@rendering_id]
116121
permissions && permissions['stats'] && permissions['stats']['queries']
117122
end
118123

119124
def get_stat_with_parameters_content(statPermissionType)
120-
permissions = get_permissions
125+
permissions = @@renderings_cached[@rendering_id]
121126
permissions && permissions['stats'] && permissions['stats'][statPermissionType]
122127
end
123128

@@ -201,7 +206,7 @@ def have_permissions_expired?
201206
# Used only for testing purpose
202207
def self.empty_cache
203208
@@permissions_cached = Hash.new
204-
@@scopes_cached = Hash.new
209+
@@renderings_cached = Hash.new
205210
@@roles_acl_activated = false
206211
@@expiration_in_seconds = (ENV['FOREST_PERMISSIONS_EXPIRATION_IN_SECONDS'] || 3600).to_i
207212
end

spec/services/forest_liana/permissions_checker_acl_enabled_spec.rb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ module ForestLiana
5050
})
5151
]
5252
}
53-
let(:scope_permissions) { nil }
53+
let(:default_rendering_id) { 1 }
54+
let(:scope_permissions) { { default_rendering_id => { 'scopes' => nil } } }
5455
let(:default_api_permissions) {
5556
{
5657
"data" => {
@@ -118,12 +119,14 @@ module ForestLiana
118119
},
119120
'renderings' => scope_permissions
120121
},
122+
"stats" => {
123+
"queries"=>[],
124+
},
121125
"meta" => {
122126
"rolesACLActivated" => true
123127
}
124128
}
125129
}
126-
let(:default_rendering_id) { 1 }
127130

128131
before do
129132
allow(ForestLiana).to receive(:apimap).and_return(schema)
@@ -368,9 +371,12 @@ module ForestLiana
368371
"data" => {
369372
'collections' => { },
370373
'renderings' => {
371-
'2' => { 'custom' => nil }
374+
other_rendering_id => { 'custom' => nil }
372375
}
373376
},
377+
"stats" => {
378+
"somestats" => [],
379+
},
374380
"meta" => {
375381
"rolesACLActivated" => true
376382
}

spec/services/forest_liana/permissions_checker_live_queries_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ module ForestLiana
2020
})
2121
]
2222
}
23-
let(:scope_permissions) { nil }
23+
let(:default_rendering_id) { 1 }
24+
let(:scope_permissions) { { default_rendering_id => { 'scopes' => nil } } }
2425
let(:default_api_permissions) {
2526
{
2627
"data" => {
@@ -61,7 +62,6 @@ module ForestLiana
6162
},
6263
}
6364
}
64-
let(:default_rendering_id) { 1 }
6565

6666
before do
6767
allow(ForestLiana).to receive(:apimap).and_return(schema)

0 commit comments

Comments
 (0)