1 module ApplicationHelper
3 ALL_PERMISSIONS = {read: true, write: true, manage: true}
6 controller.current_user
9 def invalidate_permissions_cache
10 Rails.cache.delete_matched(/^groups_for_user_/)
13 def groups_i_can(verb)
14 current_group_permissions.select { |uuid, mask| mask[verb] }.keys
17 def current_group_permissions
18 return {} unless current_user
19 Rails.cache.fetch "groups_for_user_#{current_user.uuid}" do
21 todo = {current_user.uuid => true}
24 lookup_uuids = todo.keys
25 lookup_uuids.each do |uuid| done[uuid] = true end
27 Link.where('tail_uuid in (?) and link_class = ? and head_kind = ?',
30 'orvos#group').each do |link|
31 unless done.has_key? link.head_uuid
32 todo[link.head_uuid] = true
37 link_permissions = {read:true}
39 link_permissions = {read:true,write:true}
41 link_permissions = ALL_PERMISSIONS
43 permissions_from[link.tail_uuid] ||= {}
44 permissions_from[link.tail_uuid][link.head_uuid] ||= {}
45 link_permissions.each do |k,v|
46 permissions_from[link.tail_uuid][link.head_uuid][k] ||= v
50 search_permissions(current_user.uuid, permissions_from)
56 def search_permissions(start, graph, merged={}, upstream_mask=nil, upstream_path={})
57 nextpaths = graph[start]
58 return merged if !nextpaths
59 return merged if upstream_path.has_key? start
60 upstream_path[start] = true
61 upstream_mask ||= ALL_PERMISSIONS
62 nextpaths.each do |head, mask|
65 merged[head][k] ||= v if upstream_mask[k]
67 search_permissions(head, graph, merged, upstream_mask.select { |k,v| v && merged[head][k] }, upstream_path)
69 upstream_path.delete start