PDaily/ClanCenter

View on GitHub
app/controllers/game_sessions_controller.rb

Summary

Maintainability
A
55 mins
Test Coverage
# Game Sessions Controller
class GameSessionsController < ApplicationController
  before_action :set_game_session, only: [:show, :edit, :update, :destroy, :join_game, :leave_game]
  before_action :authenticate_user!, only: [:edit, :new, :create, :join_game, :update, :destroy]
    load_and_authorize_resource

    # GET /game_sessions
    # GET /game_sessions.json
    def index
        @game_sessions = GameSession.includes(:users, :game, :game_mode)
     end

  # GET /game_sessions/1
  # GET /game_sessions/1.json
  def show
    @total_players = @game_session.users.count
    @max_players = @game_session.game_mode.total_players
  end

  # GET /game_sessions/new
  def new
    @games = Game.all
    @game_session = GameSession.new
    @game_modes = GameMode.where('game_id = ?', Game.first.id)
    @user = current_user
    @current_time = Time.now.in_time_zone(current_user.time_zone)
  end

  # GET /game_sessions/1/edit
  def edit
    @games = Game.all
    @game_modes = @game_session.game.game_modes
    @current_game = @game_session.game.id
    @current_game_mode = @game_session.game_mode.id
    @current_time = Time.now.in_time_zone(current_user.time_zone)
  end

  # POST /game_sessions
  # POST /game_sessions.json
  def create
    @game_session = GameSession.new(game_session_params)
    @game_session.active = true
    @game_session.creator = current_user

    respond_to do |format|
      if @game_session.save
        format.html { redirect_to @game_session, notice: 'Game session was successfully created.' }
        format.json { render :show, status: :created, location: @game_session }
        @game_session.users << current_user
        @game_session.game.increment!(:play_count, 1)
        @game_session.game_mode.increment!(:play_count, 1)

        @end_time =  DateTime.new(@game_session.game_date.year, @game_session.game_date.month, @game_session.game_date.day, @game_session.end_time.hour, @game_session.end_time.min)
        CleanupGameSessionsWorker.perform_in(@end_time + 1.hour, @game_session.id )
        GameSessionMailer.delay_for(1.minutes).new_game_session_email(@game_session, current_user)
      else
        format.html { render :new }
        format.json { render json: @game_session.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /game_sessions/1
  # PATCH/PUT /game_sessions/1.json
  def update
    respond_to do |format|
      if @game_session.update(game_session_params)
        format.html { redirect_to @game_session, notice: 'Game session was successfully updated.' }
        format.json { render :show, status: :ok, location: @game_session }
      else
        format.html { render :edit }
        format.json { render json: @game_session.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /game_sessions/1
  # DELETE /game_sessions/1.json
  def destroy
    @game_session.destroy
    respond_to do |format|
      format.html { redirect_to root_url, notice: 'Game session was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  def update_games
    @game_modes = GameMode.where('game_id = ?', params[:game_id])
    respond_to do |format|
      format.js
    end
  end

  def end_game
    @game_session.update_attribute(:active, false)
    respond_to do |format|
      format.html { redirect_to root_url, notice: 'Game session has successfully ended.' }
    end
  end

  def join_game
    @game_session.users << current_user
    GameSessionMailer.delay_for(1.minutes).join_game_session_email(@game_session, current_user)
    respond_to do |format|
      format.html { redirect_to @game_session, notice: 'Successfully joined game session!' }
    end
  end

  def leave_game
    @game_session.users.delete(current_user) unless current_user == @game_session.creator
    respond_to do |format|
      format.html { redirect_to root_url, notice: 'Successfully quit game session!' }
    end
  end

  private

  # Use callbacks to share common setup or constraints between actions.
  def set_game_session
    @game_session = GameSession.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def game_session_params
    params.require(:game_session).permit(:users, :notes, :game_date, :start_time, :end_time, :game_id, :game_mode_id)
  end
end