ssplatt/the_dw

View on GitHub
app/controllers/lineups_controller.rb

Summary

Maintainability
B
5 hrs
Test Coverage
require "nflapi"

class LineupsController < ApplicationController
  before_action :correct_lineup,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy
  
  def index
    @lineups = Lineup.paginate(page: params[:page])
  end
  
  def show
    @lineup = Lineup.find(params[:id])
    @nfl = NFLApi.new
    @weekstats = @nfl.get_players_stats({:statType => "weekStats",:season => @lineup.team.league.season, :week => @lineup.week})["players"]
    
    @qb = @lineup.qb_id ? @nfl.get_players_details(@lineup.qb_id)["players"][0] : {}
    @rb1 = @lineup.rb1_id ? @nfl.get_players_details(@lineup.rb1_id)["players"][0] : {}
    @rb2 = @lineup.rb2_id ? @nfl.get_players_details(@lineup.rb2_id)["players"][0] : {}
    @wr1 = @lineup.wr1_id ? @nfl.get_players_details(@lineup.wr1_id)["players"][0] : {}
    @wr2 = @lineup.wr2_id ? @nfl.get_players_details(@lineup.wr2_id)["players"][0] : {}
    
    @qb_stats = @weekstats.select{ |h| h["id"] == @lineup.qb_id.to_s }[0] || {}
    @lineup.qb_score = @qb_stats.length > 0 ? calc_score(@qb_stats) : 0
    
    @rb1_stats = @weekstats.select{ |h| h["id"] == @lineup.rb1_id.to_s }[0] || {}
    @lineup.rb1_score = @rb1_stats.length > 0 ? calc_score(@rb1_stats) : 0
    
    @rb2_stats = @weekstats.select{ |h| h["id"] == @lineup.rb2_id.to_s }[0] || {}
    @lineup.rb2_score = @rb2_stats.length > 0 ? calc_score(@rb2_stats) : 0
    
    @wr1_stats = @weekstats.select{ |h| h["id"] == @lineup.wr1_id.to_s }[0] || {}
    @lineup.wr1_score = @wr1_stats.length > 0 ? calc_score(@wr1_stats) : 0
    
    @wr2_stats = @weekstats.select{ |h| h["id"] == @lineup.wr2_id.to_s }[0] || {}
    @lineup.wr2_score = @wr2_stats.length > 0 ? calc_score(@wr2_stats) : 0
    
    @lineup.total_score = (@lineup.qb_score + @lineup.rb1_score + @lineup.rb2_score +
                          @lineup.wr1_score + @lineup.wr2_score).round(2)
    @lineup.save
    store_lineup
  end
  
  def new
    @lineup = Lineup.new
    @team = @lineup.team
    @league = @team.league
    @lineup.week = @nfl.get_players_stats({:position => "QB", :season => @league.season})["week"]
    
    @nfl = NFLApi.new
    @nfl_qbs = @nfl.get_players_stats({:position => "QB", :season => @league.season})["players"]
    @nfl_qbs = @nfl_qbs.sort_by { |player| [player['weekProjectedPts'].to_f] }.reverse!
    @nfl_rbs = @nfl.get_players_stats({:position => "RB", :season => @league.season})["players"]
    @nfl_rbs = @nfl_rbs.sort_by { |player| [player['weekProjectedPts'].to_f] }.reverse!
    @nfl_wrs = @nfl.get_players_stats({:position => "WR", :season => @league.season})["players"]
    @nfl_tes = @nfl.get_players_stats({:position => "TE", :season => @league.season})["players"]
    @nfl_wrstes = @nfl_wrs + @nfl_tes
    @nfl_wrstes = @nfl_wrstes.sort_by { |player| [player['weekProjectedPts'].to_f] }.reverse!
  end
  
  def create
    @lineup = Lineup.new(lineup_params)
    @lineup.team_id ||= current_team.id
    if @lineup.save
      flash[:info] = "New Lineup Created"
      redirect_to @lineup
    else
      render 'new'
    end
  end
  
  def edit
    @lineup = Lineup.find(params[:id])
    @team = @lineup.team
    @league = @team.league
    @nfl = NFLApi.new
    @nfl_qbs = @nfl.get_players_stats({:position => "QB", :week => @lineup.week, :season => @league.season, :statType => "weekProjectedStats"})["players"]
    @nfl_qbs = @nfl_qbs.sort_by { |player| [player['weekProjectedPts'].to_f] }.reverse!
    @nfl_rbs = @nfl.get_players_stats({:position => "RB", :week => @lineup.week, :season => @league.season, :statType => "weekProjectedStats"})["players"]
    @nfl_rbs = @nfl_rbs.sort_by { |player| [player['weekProjectedPts'].to_f] }.reverse!
    @nfl_wrs = @nfl.get_players_stats({:position => "WR", :week => @lineup.week, :season => @league.season, :statType => "weekProjectedStats"})["players"]
    @nfl_tes = @nfl.get_players_stats({:position => "TE", :week => @lineup.week, :season => @league.season, :statType => "weekProjectedStats"})["players"]
    @nfl_wrstes = @nfl_wrs + @nfl_tes
    @nfl_wrstes = @nfl_wrstes.sort_by { |player| [player['weekProjectedPts'].to_f] }.reverse!
    
    @weekstats = @nfl.get_players_stats({:statType => "weekStats",:season => @league.season, :week => @lineup.week})["players"]
    @selected_players = selected_players
    @locked_players = []
    @weekstats.each do |p|
      @locked_players.push(p["id"])
    end
    @disabled_players = @locked_players + @selected_players
  end
  
  def update
    @lineup = Lineup.find(params[:id])
    if @lineup.update_attributes(lineup_params)
      flash[:success] = "Lineup updated"
      redirect_to @lineup
    else
      render 'edit'
    end
  end
  
  def destroy
    Lineup.find(params[:id]).destroy
    flash[:success] = "Lineup deleted"
    redirect_to lineups_url
  end
  
  private

    def lineup_params
      params.require(:lineup).permit(:qb_id, :rb1_id, :rb2_id, :wr1_id, :wr2_id, :week, :division_id)
    end
    
    # Confirms the correct team.
    def correct_lineup
      @lineup = Lineup.find(params[:id])
      redirect_to(@lineup) unless current_team?(@lineup.team) || current_user.admin? || current_team.is_commissioner?
    end
    
    def calc_score(player_week_stats)
      score = 0
      
      player_week_stats["stats"].each do |k,v|
        case k
        when "5"
          score += v.to_i * @lineup.team.league.pa_yd
        when "6"
          score += v.to_i * @lineup.team.league.pa_td
        when "7"
          score += v.to_i * @lineup.team.league.pa_int
        when "14"
          score += v.to_i * @lineup.team.league.ru_yd
        when "15"
          score += v.to_i * @lineup.team.league.ru_td
        when "20"
          score += v.to_i * @lineup.team.league.rec
        when "21"
          score += v.to_i * @lineup.team.league.re_yd
        when "22"
          score += v.to_i * @lineup.team.league.re_td
        when "30"
          score += v.to_i * @lineup.team.league.fuml
        when "31"
          score += v.to_i * @lineup.team.league.fum
        when "32"
          score += v.to_i * @lineup.team.league.tpc
        end
      end
      
      return score.round(2)
    end
    
    def selected_players
      @selected_players = []
      lus = current_team.lineups.where.not(id: @lineup.id)
      lus.each do |p|
        if p.qb_id
          @selected_players.push(p.qb_id)
        end
        if p.rb1_id
          @selected_players.push(p.rb1_id)
        end
        if p.rb2_id
          @selected_players.push(p.rb2_id)
        end
        if p.wr1_id
          @selected_players.push(p.wr1_id)
        end
        if p.wr2_id
          @selected_players.push(p.wr2_id)
        end
      end
      return @selected_players
    end
  
end