agile-alliance-brazil/submissions

View on GitHub
app/controllers/reviewers_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
B
89%
# frozen_string_literal: true

class ReviewersController < ApplicationController
  def index
    filter_params = params.permit(reviewer_filter: %i[state track_id])
    @reviewer_filter = ReviewerFilter.new(filter_params)
    @tracks = @conference.tracks
    @states = resource_class.state_machine.states.map(&:name)
    @reviewers = @reviewer_filter.apply(Reviewer)
                                 .for_conference(@conference)
                                 .joins(:user)
                                 .order('first_name, last_name')
                                 .includes(user: [:reviews], accepted_preferences: [], conference: [])
    @reviewer_batch = ReviewerBatch.new(conference: @conference)
    query = resource_class
            .where('conference_id != ? and state = ?',
                   @conference.id, :accepted)
    @reviewers.empty? ||
      query = query.where('user_id not in (?)', @reviewers.map(&:user_id))
    @previous_reviewers = query
                          .includes(user: [:reviews], conference: []).group_by(&:user)
    @reviewer = resource_class.new(conference: @conference)
    respond_to do |format|
      format.html
    end
  end

  def create
    reviewer = new_reviewer
    if reviewer.try(:save)
      message = t('flash.reviewer.create.success')
      reviewer = ReviewerJsonBuilder.new(reviewer).to_json

      respond_to do |format|
        format.json do
          render json: {
            message: message,
            reviewer: reviewer
          }.to_json, status: :created
        end
      end
    else
      message = t('flash.reviewer.create.failure', username: reviewer.try(:user_username))
      respond_to do |format|
        format.json { render json: message, status: :bad_request }
      end
    end
  end

  def create_multiple
    batch = ReviewerBatch.new(batch_params.merge(conference: @conference))
    batch.save

    respond_to do |format|
      format.json { render json: batch.to_json, status: :ok }
    end
  end

  def show
    @reviewer = Reviewer.where(id: params[:id])
                        .includes(
                          user: {
                            reviews: {
                              session: [:track],
                              recommendation: [],
                              review_evaluations: []
                            }
                          },
                          conference: [], accepted_preferences: %i[audience_level track]
                        ).first
    respond_to do |format|
      format.html
    end
  end

  def destroy
    reviewer = resource_class.where(id: params[:id]).includes(:user).first
    if reviewer.nil?
      respond_to do |format|
        format.json { render json: 'not-found', status: :not_found }
      end
    else
      reviewer.destroy
      message = t('flash.reviewer.destroy.success', full_name: reviewer.user.full_name)
      respond_to do |format|
        format.json { render json: { message: message }.to_json, status: :ok }
      end
    end
  end

  protected

  def resource_class
    Reviewer
  end

  def new_reviewer
    return unless params[:reviewer]

    resource_class.new(new_reviewer_params).tap do |r|
      r.conference = @conference
    end
  end

  def new_reviewer_params
    params.require(:reviewer).permit(:user_username)
  end

  def batch_params
    params[:reviewer_batch].try(:[]=, :usernames, []) if params[:reviewer_batch].try(:[], :usernames).nil?
    params.require(:reviewer_batch).permit(usernames: [])
  end
end