testmycode/tmc-server

View on GitHub
app/controllers/feedback_questions_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

# Handles the feedback question editing UI.
class FeedbackQuestionsController < ApplicationController
  before_action :set_course
  before_action :set_organization

  def index
    add_course_breadcrumb
    add_breadcrumb 'Feedback questions'

    @questions = @course.feedback_questions.order(:position)
    authorize! :manage_feedback_questions, @course
  end

  def new
    @question = FeedbackQuestion.new(course: @course)
    authorize! :manage_feedback_questions, @course
    add_course_breadcrumb
    add_breadcrumb 'Feedback questions', organization_course_feedback_questions_path(@organization, @course)
    add_breadcrumb 'Add new question'
  end

  def create
    @question = FeedbackQuestion.new(feedback_question_params[:feedback_question])
    @question.course = @course
    authorize! :manage_feedback_questions, @course

    fix_question_kind(@question)

    if @question.save
      flash[:success] = 'Question created.'
      redirect_to organization_course_feedback_questions_path(@organization, @question.course)
    else
      flash.now[:error] = 'Failed to create question.'
      render :new
    end
  end

  def show
    @question = FeedbackQuestion.find(params[:id])
    @course = @question.course
    @organization = @course.organization
    authorize! :manage_feedback_questions, @course
    add_course_breadcrumb
    add_breadcrumb 'Feedback questions', organization_course_feedback_questions_path(@organization, @course)
    add_breadcrumb "Question #{@question.title}"
  end

  def update
    @question = FeedbackQuestion.find(params[:id])
    @course = @question.course
    @organization = @course.organization
    authorize! :manage_feedback_questions, @course

    @question.question = params[:feedback_question][:question]
    @question.title = params[:feedback_question][:title]

    if @question.save
      flash[:success] = 'Question updated.'
      redirect_to organization_course_feedback_questions_path(@organization, @question.course)
    else
      flash.now[:error] = 'Failed to update question.'
      render :new
    end
  end

  def destroy
    @question = FeedbackQuestion.find(params[:id])
    @course = @question.course
    @organization = @course.organization
    authorize! :manage_feedback_questions, @course

    begin
      @question.destroy
      flash[:success] = 'Question deleted.'
      redirect_to organization_course_feedback_questions_path(@organization, @course)
    rescue StandardError
      flash[:error] = "Failed to delete question: #{$!}"
      redirect_to organization_course_feedback_questions_path(@organization, @course)
    end
  end

  private
    def feedback_question_params
      params.permit({ feedback_question: %i[question title kind] }, :intrange_min, :intrange_max, :commit, :course_id)
    end

    def set_course
      @course = Course.find(params[:course_id]) if params[:course_id]
      authorize! :read, @course
    end

    def fix_question_kind(question)
      return unless question.kind == 'intrange'
      question.kind += "[#{params[:intrange_min]}..#{params[:intrange_max]}]"
    end

    def set_organization
      @organization = Organization.find_by(slug: params[:organization_id])
    end
end