# frozen_string_literal: true class QuizController < ApplicationController before_action :authorize_candidate def question qid = prep_status.current_question_id || params[:question_id] redirect_to :summary and return if qid.nil? prep_question qid @answer = prep_answer qid prep_instance_answer @question end def update_answer @answer = prep_answer answer_params[:question_id] prep_status prep_question(answer_params[:question_id]) @answer.update(process_answer_params) route_answer_xhr and return if request.xhr? route_answer_html end def summary @quiz = current_candidate.my_quiz redirect_to :question and return unless prep_status.current_question_id.nil? end def submit_summary not_completed_error = 'You must complete all questions to submit your test.' redirect_to :summary, flash: { error: not_completed_error } and return unless prep_status.can_submit complete_and_email redirect_to :thankyou end private def complete_and_email if current_candidate.update_attributes(completed: true, completed_at: DateTime.current) current_candidate.build_reviews CandidateMailer.submitted(current_candidate).deliver_later RecruiterMailer.candidate_submitted(current_candidate).deliver_later ReviewerMailer.candidate_submission(current_candidate).deliver_later return true end end def prep_question qid @question = current_candidate.fetch_question(qid) end def prep_status @status ||= QuizStatus.new(current_candidate) end def prep_instance_answer question @answer = question.answer.nil? ? Answer.new : Answer.find(question.answer_id) end def answer_params params.require(:answer).permit( :question_id, :answer, :answer_id, answer_array: [], answer_hash: [:later, :html, :css, :js, :text, :other, options: []] ) end def process_answer_params answer = answer_params answer[:saved] = params.key?(:save) answer[:submitted] = params.key?(:submit) answer[:answer] = answer_params[:answer_array] unless answer_params[:answer_array].nil? answer[:answer] = answer_params[:answer_hash].to_h unless answer_params[:answer_hash].nil? answer end def prep_answer qid = answer_params[:question_id] answer_ids = { question_id: qid, candidate_id: current_candidate.to_i } answer = Answer.find_or_create_by(answer_ids) answer end def route_answer_html if @answer.errors.present? prep_question answer_params[:question_id] flash[:error] = answer_params[:question_id].to_i render :question else redirect_to :saved and return if params.key?(:save) redirect_to :question end end def route_answer_xhr if @answer.errors.present? render json: @answer.errors["answer"].to_json, status: 400 else results = { message: "Your answer has been updated successfully!", can_submit: prep_status.can_submit, progress: prep_status.progress } render json: results.to_json end end end