Module: ForestAdminAgent::Routes::QueryHandler

Includes:
Builder, Utils, ForestAdminDatasourceToolkit::Components::Query, ForestAdminDatasourceToolkit::Validations
Included in:
Resources::Count, Resources::Csv, Resources::List, Resources::NativeQuery
Defined in:
lib/forest_admin_agent/routes/query_handler.rb

Instance Method Summary collapse

Instance Method Details

#execute_query(datasource, query, connection_name, permissions, caller, context_variables) ⇒ Object



17
18
19
20
21
22
23
# File 'lib/forest_admin_agent/routes/query_handler.rb', line 17

def execute_query(datasource, query, connection_name, permissions, caller, context_variables)
  query = query.strip
  query, binds = inject_context_variables(datasource, connection_name, query, permissions, caller,
                                          context_variables)

  datasource.execute_native_query(connection_name, query, binds)
end

#inject_context_variables(datasource, connection_name, query, permissions, caller, context_variables) ⇒ Object



9
10
11
12
13
14
15
# File 'lib/forest_admin_agent/routes/query_handler.rb', line 9

def inject_context_variables(datasource, connection_name, query, permissions, caller, context_variables)
  user = permissions.get_user_data(caller.id)
  team = permissions.get_team(caller.rendering_id)
  context_variables = ContextVariables.new(team, user, context_variables)

  ContextVariablesInjector.inject_context_in_native_query(datasource, connection_name, query, context_variables)
end

#parse_query_segment(collection, args, permissions, caller) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/forest_admin_agent/routes/query_handler.rb', line 25

def parse_query_segment(collection, args, permissions, caller)
  return unless args[:params][:segmentQuery]

  unless args[:params][:connectionName]
    raise ForestAdminAgent::Http::Exceptions::UnprocessableError, 'Missing native query connection attribute'
  end

  QueryValidator.valid?(args[:params][:segmentQuery])

  permissions.can_execute_query_segment?(collection, args[:params][:segmentQuery], args[:params][:connectionName])

  ids = execute_query(
    collection.datasource,
    args[:params][:segmentQuery],
    args[:params][:connectionName],
    permissions,
    caller,
    args[:params][:contextVariables]
  ).map(&:values)

  condition_tree_segment = ConditionTree::ConditionTreeFactory.match_ids(collection, ids)
  ConditionTreeValidator.validate(condition_tree_segment, collection)

  condition_tree_segment
end