Class: Nquery::Permissions::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/nquery/permissions/resolver.rb

Constant Summary collapse

COLLECTION_LEVELS =
{ "no_access" => 0, "view" => 1, "curate" => 2 }.freeze
DATA_VIEW_LEVELS =
{ "blocked" => 0, "can_view" => 1 }.freeze
CREATE_QUERY_LEVELS =
{ "no" => 0, "query_builder" => 1, "native" => 2, "query_builder_and_native" => 3 }.freeze
APP_LEVELS =
{ "no" => 0, "yes" => 1 }.freeze

Instance Method Summary collapse

Constructor Details

#initialize(user) ⇒ Resolver

Returns a new instance of Resolver.



11
12
13
14
# File 'lib/nquery/permissions/resolver.rb', line 11

def initialize(user)
  @user = user
  @groups = user&.groups&.to_a || []
end

Instance Method Details

#admin?Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/nquery/permissions/resolver.rb', line 16

def admin?
  @groups.any? { |g| g.system_group == "administrators" }
end

#all_users_more_permissive?(group, collection: nil, data_source: nil) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/nquery/permissions/resolver.rb', line 50

def all_users_more_permissive?(group, collection: nil, data_source: nil)
  all_users = Nquery::Group.find_by(system_group: "all_users")
  return false unless all_users

  if collection
    all_users_level = Nquery::CollectionPermission.find_by(group: all_users, collection: collection)&.access_level
    group_level = Nquery::CollectionPermission.find_by(group: group, collection: collection)&.access_level
    return COLLECTION_LEVELS[all_users_level].to_i > COLLECTION_LEVELS[group_level].to_i
  end

  false
end

#application_access(feature) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/nquery/permissions/resolver.rb', line 41

def application_access(feature)
  return :yes if admin?

  levels = @groups.filter_map do |group|
    Nquery::ApplicationPermission.find_by(group: group, feature: feature)&.access_level
  end
  (max_level(levels, APP_LEVELS) || "no").to_sym
end

#collection_access(collection) ⇒ Object



20
21
22
23
24
25
26
27
28
# File 'lib/nquery/permissions/resolver.rb', line 20

def collection_access(collection)
  return :curate if admin?

  levels = @groups.filter_map do |group|
    perm = Nquery::CollectionPermission.find_by(group: group, collection: collection)
    perm&.access_level
  end
  max_level(levels, COLLECTION_LEVELS)&.to_sym || :no_access
end

#data_access(data_source, resource_path: nil, permission_type: "view_data") ⇒ Object



30
31
32
33
34
35
36
37
38
39
# File 'lib/nquery/permissions/resolver.rb', line 30

def data_access(data_source, resource_path: nil, permission_type: "view_data")
  return highest_data_level(permission_type) if admin?

  levels = @groups.flat_map do |group|
    Nquery::DataPermission.where(group: group, data_source: data_source, permission_type: permission_type)
                        .where("resource_path IS NULL OR resource_path = ?", resource_path)
                        .pluck(:access_level)
  end
  max_data_level(levels, permission_type)
end