foodcoops/foodsoft

View on GitHub
plugins/polls/app/controllers/polls_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
class PollsController < ApplicationController
  before_action -> { require_plugin_enabled FoodsoftPolls }

  def index
    @polls = Poll.page(params[:page]).per(@per_page).order(created_at: :desc)
  end

  def show
    @poll = Poll.find(params[:id])
  end

  def new
    @poll = Poll.new
  end

  def create
    @poll = Poll.new(poll_params)
    @poll.created_by = current_user

    if @poll.save
      redirect_to @poll, notice: t('.notice')
    else
      render action: 'edit'
    end
  end

  def edit
    @poll = Poll.find(params[:id])

    return unless user_has_no_right

    redirect_to polls_path, alert: t('.no_right')
  end

  def update
    @poll = Poll.find(params[:id])

    if user_has_no_right
      redirect_to polls_path, alert: t('.no_right')
    elsif @poll.update(poll_params)
      redirect_to @poll, notice: t('.notice')
    else
      render action: 'edit'
    end
  end

  def destroy
    @poll = Poll.find(params[:id])

    if user_has_no_right
      redirect_to polls_path, alert: t('.no_right')
    else
      @poll.destroy
      redirect_to polls_path, notice: t('.notice')
    end
  rescue StandardError => e
    redirect_to polls_path, alert: t('.error', error: e.message)
  end

  def vote
    @poll = Poll.find(params[:id])

    if @poll.one_vote_per_ordergroup
      ordergroup = current_user.ordergroup
      return redirect_to polls_path, alert: t('.no_ordergroup') unless ordergroup

      attributes = { ordergroup: ordergroup }
    else
      attributes = { user: current_user }
    end

    redirect_to @poll, alert: t('.no_right') unless @poll.user_can_vote?(current_user)

    @poll_vote = @poll.poll_votes.where(attributes).first_or_initialize

    return unless request.post?

    @poll_vote.update!(note: params[:note], user: current_user)

    if @poll.single_select?
      choices = {}
      choice = params[:choice]
      choices[choice] = '1' if choice
    else
      choices = params[:choices].try(:to_h) || {}
    end

    @poll_vote.poll_choices = choices.map do |choice, value|
      poll_choice = @poll_vote.poll_choices.where(choice: choice).first_or_initialize
      poll_choice.update!(value: value)
      poll_choice
    end

    redirect_to @poll
  end

  private

  def user_has_no_right
    @poll.created_by != current_user && !current_user.role_admin?
  end

  def poll_params
    params
      .require(:poll)
      .permit(:name, :starts_date_value, :starts_time_value, :ends_date_value,
              :ends_time_value, :description, :one_vote_per_ordergroup, :voting_method,
              :multi_select_count, :min_points, :max_points, choices: [],
                                                             required_ordergroup_custom_fields: [], required_user_custom_fields: [])
  end
end