Implement server side query building for flowr

This commit is contained in:
Maximilian Grundke
2018-09-18 10:34:38 +02:00
parent 29227cbe14
commit 097938aa6b
3 changed files with 45 additions and 1 deletions

View File

@ -0,0 +1,42 @@
class FlowrController < ApplicationController
def insights
unless current_user
skip_authorization
respond_to do |format|
format.html { render_not_authorized }
format.json { render json: {}, status: :unauthorized }
end
else
# get the latest submission for this user that also has a test run (i.e. structured_errors if applicable)
submission = Submission.joins(:testruns)
.where(submissions: {user_id: current_user.id, user_type: current_user.class.name})
.order('testruns.created_at DESC').first
# verify authorization for the submission, as all queried errors are generated by this submission anyway
# and structured_errors don't have a policy yet
authorize(submission)
errors = StructuredError.where(submission_id: submission.id)
# for each error get all attributes, filter out uninteresting ones, and build a query
insights = errors.map do |error|
attributes = error.structured_error_attributes.select do |attribute|
is_interesting(attribute) and attribute.match
end
# once the programming language model becomes available, the language name can be added to the query to
# produce more relevant results
query = attributes.map{|att| att.value}.join(' ')
{ submission: submission, error: error, attributes: attributes, query: query }
end
respond_to do |format|
format.html { render json: insights, status: :ok }
format.json { render json: insights, status: :ok }
end
end
end
def is_interesting(attribute)
attribute.error_template_attribute.key.index(/error message|error type/i) != nil
end
private :is_interesting
end

View File

@ -8,7 +8,7 @@ class SubmissionPolicy < ApplicationPolicy
everyone
end
[:download?, :download_file?, :render_file?, :run?, :score?, :show?, :statistics?, :stop?, :test?].each do |action|
[:download?, :download_file?, :render_file?, :run?, :score?, :show?, :statistics?, :stop?, :test?, :insights?].each do |action|
define_method(action) { admin? || author? }
end

View File

@ -42,6 +42,8 @@ Rails.application.routes.draw do
get '/help', to: 'application#help'
get '/insights', to: 'flowr#insights'
get 'statistics/', to: 'statistics#show'
get 'statistics/graphs', to: 'statistics#graphs'
get 'statistics/graphs/user-activity', to: 'statistics#user_activity'