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_/)
14 return {} unless current_user
15 Rails.cache.fetch "groups_for_user_#{current_user.uuid}" do
17 todo = {current_user.uuid => true}
20 lookup_uuids = todo.keys
21 lookup_uuids.each do |uuid| done[uuid] = true end
23 Link.where('tail_uuid in (?) and link_class = ? and head_kind = ?',
26 'orvos#group').each do |link|
27 unless done.has_key? link.head_uuid
28 todo[link.head_uuid] = true
33 link_permissions = {read:true}
35 link_permissions = {read:true,write:true}
37 link_permissions = ALL_PERMISSIONS
39 permissions_from[link.tail_uuid] ||= {}
40 permissions_from[link.tail_uuid][link.head_uuid] ||= {}
41 link_permissions.each do |k,v|
42 permissions_from[link.tail_uuid][link.head_uuid][k] ||= v
46 search_permissions(current_user.uuid, permissions_from)
52 def search_permissions(start, graph, merged={}, upstream_mask=nil, upstream_path={})
53 nextpaths = graph[start]
54 return merged if !nextpaths
55 return merged if upstream_path.has_key? start
56 upstream_path[start] = true
57 upstream_mask ||= ALL_PERMISSIONS
58 nextpaths.each do |head, mask|
61 merged[head][k] ||= v if upstream_mask[k]
63 search_permissions(head, graph, merged, upstream_mask.select { |k,v| v && merged[head][k] }, upstream_path)
65 upstream_path.delete start