Refactor /insights to throw a Pundit exception if no current_user is set
This commit is contained in:
@ -14,8 +14,15 @@ class ApplicationController < ActionController::Base
|
|||||||
@current_user ||= ExternalUser.find_by(id: session[:external_user_id]) || login_from_session || login_from_other_sources
|
@current_user ||= ExternalUser.find_by(id: session[:external_user_id]) || login_from_session || login_from_other_sources
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def require_user!
|
||||||
|
raise Pundit::NotAuthorizedError unless current_user
|
||||||
|
end
|
||||||
|
|
||||||
def render_not_authorized
|
def render_not_authorized
|
||||||
redirect_to(request.referrer || :root, alert: t('application.not_authorized'))
|
respond_to do |format|
|
||||||
|
format.html { redirect_to(request.referrer || :root, alert: t('application.not_authorized')) }
|
||||||
|
format.json { render json: {error: t('application.not_authorized')}, status: :unauthorized }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
private :render_not_authorized
|
private :render_not_authorized
|
||||||
|
|
||||||
|
@ -1,38 +1,29 @@
|
|||||||
class FlowrController < ApplicationController
|
class FlowrController < ApplicationController
|
||||||
|
|
||||||
def insights
|
def insights
|
||||||
unless current_user
|
require_user!
|
||||||
skip_authorization
|
# get the latest submission for this user that also has a test run (i.e. structured_errors if applicable)
|
||||||
respond_to do |format|
|
submission = Submission.joins(:testruns)
|
||||||
format.html { render_not_authorized }
|
.where(submissions: {user_id: current_user.id, user_type: current_user.class.name})
|
||||||
format.json { render json: {}, status: :unauthorized }
|
.order('testruns.created_at DESC').first
|
||||||
end
|
# verify authorization for the submission, as all queried errors are generated by this submission anyway
|
||||||
else
|
# and structured_errors don't have a policy yet
|
||||||
# get the latest submission for this user that also has a test run (i.e. structured_errors if applicable)
|
authorize(submission)
|
||||||
submission = Submission.joins(:testruns)
|
errors = StructuredError.where(submission_id: submission.id)
|
||||||
.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
|
# for each error get all attributes, filter out uninteresting ones, and build a query
|
||||||
insights = errors.map do |error|
|
insights = errors.map do |error|
|
||||||
attributes = error.structured_error_attributes.select do |attribute|
|
attributes = error.structured_error_attributes.select do |attribute|
|
||||||
is_interesting(attribute) and attribute.match
|
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
|
||||||
|
# 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
|
end
|
||||||
|
|
||||||
|
# Always return JSON
|
||||||
|
render json: insights, status: :ok
|
||||||
end
|
end
|
||||||
|
|
||||||
def is_interesting(attribute)
|
def is_interesting(attribute)
|
||||||
|
Reference in New Issue
Block a user