Module: Motor::BuildSchema::ApplyPermissions

Defined in:
lib/motor/build_schema/apply_permissions.rb

Class Method Summary collapse

Class Method Details

.call(schema, ability) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/motor/build_schema/apply_permissions.rb', line 8

def call(schema, ability)
  schema.map do |model|
    klass = model[:class_name].constantize

    next unless ability.can?(:read, klass)

    model[:associations] = filter_associations(model[:associations], ability)
    model[:columns] = filter_columns(klass, model[:columns], ability)
    model[:actions] = filter_actions(klass, model[:actions], ability)
    model[:tabs] = filter_tabs(klass, model[:tabs], ability)

    model
  end.compact
end

.filter_actions(model, actions, ability) ⇒ Object



57
58
59
60
61
# File 'lib/motor/build_schema/apply_permissions.rb', line 57

def filter_actions(model, actions, ability)
  actions.select do |action|
    ability.can?(action[:name].to_sym, model)
  end
end

.filter_associations(associations, ability) ⇒ Object



23
24
25
26
27
28
29
# File 'lib/motor/build_schema/apply_permissions.rb', line 23

def filter_associations(associations, ability)
  associations.select do |assoc|
    model_class = assoc[:model_name].classify.safe_constantize

    model_class && ability.can?(:read, model_class)
  end
end

.filter_columns(model, columns, ability) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/motor/build_schema/apply_permissions.rb', line 38

def filter_columns(model, columns, ability)
  columns.map do |column|
    next unless ability.can?(:read, model, column[:name])

    reference_model_name = column.dig(:reference, :model_name)
    model_class = reference_model_name&.classify&.safe_constantize

    next if reference_model_name &&
            (model_class.nil? || !ability.can?(:read, model_class))

    if !ability.can?(:update, model, column[:name]) &&
       column[:access_type] != BuildSchema::ColumnAccessTypes::HIDDEN
      column = column.merge(access_type: BuildSchema::ColumnAccessTypes::READ_ONLY)
    end

    column
  end.compact
end

.filter_tabs(_model, tabs, ability) ⇒ Object



31
32
33
34
35
36
# File 'lib/motor/build_schema/apply_permissions.rb', line 31

def filter_tabs(_model, tabs, ability)
  tabs = tabs.reject { |t| t[:name] == 'audits' } unless ability.can?(:read, Motor::Audit)
  tabs = tabs.reject { |t| t[:name] == 'notes' } unless ability.can?(:read, Motor::Note)

  tabs
end