class ContestantsController < ApplicationController before_action :set_contest before_action :set_contestant, only: %i[ destroy edit update] before_action :set_completions, only: %i[edit update ] def edit authorize @contest end def new authorize @contest @contestant = Contestant.new end def create authorize @contest @contestant = Contestant.new(contestant_params) @contestant.contest_id = @contest.id if @contestant.save redirect_to contest_path(@contest) else render :new, status: :unprocessable_entity end end def update authorize @contest if @contestant.update(contestant_params) redirect_to @contest else render :edit, status: :unprocessable_entity end end def destroy authorize @contest @contestant.destroy redirect_to contest_path(@contest) end def import authorize @contest @csv_import = CsvImport.new end def upload_csv authorize @contest @csv_import = CsvImport.new(params.require(:csv_import).permit(:file, :separator)) if @csv_import.save redirect_to "/contests/#{@contest.id}/import/#{@csv_import.id}" else render :import, status: :unprocessable_entity end end def convert_csv authorize @contest @csv_import = CsvImport.find(params[:id]) @content = JSON.parse(@csv_import.content) @form = Forms::CsvConversionForm.new end def finalize_import authorize @contest @csv_import = CsvImport.find(params[:id]) @content = JSON.parse(@csv_import.content) all_params = params.require(:forms_csv_conversion_form) @form = Forms::CsvConversionForm.new(params.require(:forms_csv_conversion_form).permit(:email_column, :name_column)) if @form.valid? @content.each_with_index do |row, i| if all_params["row_#{i}".to_sym] == "1" if @form.email_column == -1 Contestant.create(name: row[@form.name_column], contest: @contest) else Contestant.create(name: row[@form.name_column], email: row[@form.email_column], contest: @contest) end end end redirect_to contest_path(@contest) else render :convert_csv, status: :unprocessable_entity end end private def set_contest @contest = Contest.find(params[:contest_id]) end def set_contestant @contestant = Contestant.find(params[:id]) end def set_completions @completions = @contestant.completions.order(:time_seconds) end def contestant_params params.expect(contestant: [ :email, :name ]) end end