holderdeord/hdo-site

View on GitHub
app/controllers/admin/questions_controller.rb

Summary

Maintainability
A
2 hrs
Test Coverage
class Admin::QuestionsController < AdminController
  before_filter :fetch_question, except: :index
  before_filter :assert_moderator, except: :index
  before_filter :require_edit, except: :index

  STATUSES = [
    :pending,
    :answer_pending,
    :approved,
    :rejected,
    :answer_rejected,
    :unanswered,
    :finally_rejected
  ].freeze

  def index
    @questions_by_status = {
      pending:          Question.pending.order(:created_at),
      answer_pending:   Question.with_pending_answers.order('answers.created_at'),
      approved:         Question.answered.where('answers.status = ?', 'approved').order('answers.created_at DESC'),
      rejected:         Question.rejected.order('created_at DESC'),
      answer_rejected:  Question.answered.where('answers.status = ?', 'rejected').order('answers.created_at DESC'),
      unanswered:       Question.not_ours.approved.order("created_at DESC").unanswered,
      finally_rejected: Question.finally_rejected.order(:updated_at)
    }

    @active_tab = if @questions_by_status[:answer_pending].any?
      :answer_pending
    elsif @questions_by_status[:pending].any?
      :pending
    else
      :approved
    end

    @show_edit = policy(Question).moderate?
  end

  def edit
    @answer = @question.answer
  end

  def update
    issue_ids = params[:question][:issues].reject(&:blank?) if params[:question][:issues]

    @question.issues = Issue.find(issue_ids || [])
    @question.status = params[:question][:status]

    question_attributes = params[:question].slice(:internal_comment, :body, :from_name, :show_sender, :tag_list)

    @question.update_attributes(question_attributes)

    if @question && @question.answer
      @question.answer.update_attributes(params[:question][:answer]) if params[:question][:answer]
      @question.answer.update_attributes(body: params[:question][:answer_body])
    end

    if @question.save
      redirect_to edit_admin_question_path(@question), notice: t('app.questions.edit.updated')
    else
      redirect_to edit_admin_question_path(@question), alert: @question.errors.full_messages.to_sentence
    end
  end

  def create_answer
    @question.create_answer!(representative: @question.representative, body: '-')
    redirect_to edit_admin_question_path(@question), notice: 'Opprettet'
  end

  def question_approved_email_rep
    if !@question.representative.confirmed? && @question.representative.confirmation_token.nil?
      redirect_to edit_admin_question_path(@question), alert: t('app.questions.edit.rep_not_invited')
    elsif !@question.approved?
      redirect_to edit_admin_question_path(@question), alert: t('app.questions.edit.question_not_approved')
    else
      ModerationMailer.question_approved_representative_email(@question).deliver
      redirect_to edit_admin_question_path(@question), notice: t('app.questions.edit.email_sent', email: @question.representative.email)
    end
  end

  def question_approved_email_user
    unless @question.approved?
      redirect_to edit_admin_question_path(@question), alert: t('app.questions.edit.question_not_approved')
    else
      ModerationMailer.question_approved_user_email(@question).deliver
      redirect_to edit_admin_question_path(@question), notice: t('app.questions.edit.email_sent', email: @question.from_email)
    end
  end

  def question_rejected_email_user
    if @question.rejected?
      if params[:reason].blank?
        redirect_to edit_admin_question_path(@question), alert: t('app.questions.edit.no_reject_reason')
      else
        @question.update_attributes(rejection_reason: params[:reason])
        if @question.save
          ModerationMailer.question_rejected_user_email(@question).deliver
          redirect_to edit_admin_question_path(@question), notice: t('app.questions.edit.email_sent', email: @question.from_email)
        else
          redirect_to edit_admin_question_path(@question), alert: @question.errors.full_messages.to_sentence
        end
      end
    else
      redirect_to edit_admin_question_path(@question), alert: t('app.questions.edit.question_not_rejected')
    end
  end

  def answer_approved_email_user
    unless @question.has_approved_answer?
      redirect_to edit_admin_question_path(@question), alert: t('app.questions.edit.answer_not_approved')
    else
      ModerationMailer.answer_approved_user_email(@question).deliver
      redirect_to edit_admin_question_path(@question), notice: t('app.questions.edit.email_sent', email: @question.from_email)
    end
  end

  private

  def fetch_question
    @question = Question.find(params[:id])
  end

  def assert_moderator
    authorize @question, :moderate?
  end
end