class CompletionsController < ApplicationController include CompletionsConcern before_action :set_contest before_action :set_data, only: %i[ create edit new update ] before_action :set_completion, only: %i[ destroy edit update ] def edit authorize @contest @title = "Edit completion" end def new authorize @contest @completion = Completion.new if params[:contestant_id] @completion.contestant_id = params[:contestant_id] end @title = "New completion" end def create authorize @contest @completion = Completion.new(completion_params) @completion.contest_id = @contest.id if @completion.save extend_completions!(@completion.contestant) redirect_to contest_path(@contest) else logger = Logger.new(STDOUT) logger.info(@completion.errors) @title = "New completion" render :new, status: :unprocessable_entity end end def update authorize @contest if params[:contestant_id] @completion.contestant_id = params[:contestant_id] end if @completion.update(completion_params) extend_completions!(@completion.contestant) redirect_to @contest else @title = "Edit completion" render :edit, status: :unprocessable_entity end end def destroy authorize @contest @completion.destroy if params[:contestant_id] redirect_to contest_contestant_path(@contest, params[:contestant_id]) else redirect_to contest_path(@contest) end end private def set_contest @contest = Contest.find(params[:contest_id]) end def set_data @contestants = @contest.contestants @puzzles = @contest.puzzles end def set_completion @completion = Completion.find(params[:id]) end def completion_params params.expect(completion: [ :time_seconds, :contestant_id, :puzzle_id ]) end end