nixsolutions /
ggf
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | |||
| 3 | namespace App; |
||
| 4 | |||
| 5 | use Illuminate\Database\Eloquent\Model; |
||
| 6 | use Illuminate\Support\Collection; |
||
| 7 | |||
| 8 | /** |
||
| 9 | * Class Tournament |
||
| 10 | * @package App |
||
| 11 | */ |
||
| 12 | class Tournament extends Model |
||
| 13 | { |
||
| 14 | /** |
||
| 15 | * @var string |
||
| 16 | */ |
||
| 17 | protected $table = 'tournaments'; |
||
| 18 | |||
| 19 | /** |
||
| 20 | * @var array |
||
| 21 | */ |
||
| 22 | protected $fillable = ['name', 'description', 'status', 'type', 'membersType']; |
||
| 23 | |||
| 24 | /** |
||
| 25 | * @var bool |
||
| 26 | */ |
||
| 27 | public $timestamps = true; |
||
| 28 | |||
| 29 | const MEMBERS_TYPE_SINGLE = 'single'; |
||
| 30 | const MEMBERS_TYPE_DOUBLE = 'double'; |
||
| 31 | |||
| 32 | const TYPE_LEAGUE = 'league'; |
||
| 33 | const TYPE_KNOCK_OUT = 'knock_out'; |
||
| 34 | const TYPE_MULTISTAGE = 'multistage'; |
||
| 35 | |||
| 36 | const STATUS_DRAFT = 'draft'; |
||
| 37 | const STATUS_STARTED = 'started'; |
||
| 38 | const STATUS_COMPLETED = 'completed'; |
||
| 39 | const STATUS_DELETED = 'deleted'; |
||
| 40 | |||
| 41 | const MIN_TEAMS_AMOUNT = 2; |
||
| 42 | |||
| 43 | /** |
||
| 44 | * @return \Illuminate\Database\Eloquent\Relations\HasMany |
||
| 45 | */ |
||
| 46 | public function tournamentTeams() |
||
| 47 | { |
||
| 48 | return $this->hasMany(TournamentTeam::class, 'tournamentId'); |
||
| 49 | } |
||
| 50 | |||
| 51 | /** |
||
| 52 | * @return \Illuminate\Database\Eloquent\Relations\HasMany |
||
| 53 | */ |
||
| 54 | public function matches() |
||
| 55 | { |
||
| 56 | return $this->hasMany(Match::class, 'tournamentId'); |
||
| 57 | } |
||
| 58 | |||
| 59 | /** |
||
| 60 | * @return array |
||
| 61 | */ |
||
| 62 | public static function getAvailableMembersType() |
||
| 63 | { |
||
| 64 | return [ |
||
| 65 | self::MEMBERS_TYPE_SINGLE, |
||
| 66 | self::MEMBERS_TYPE_DOUBLE, |
||
| 67 | ]; |
||
| 68 | } |
||
| 69 | |||
| 70 | /** |
||
| 71 | * @return array |
||
| 72 | */ |
||
| 73 | public static function getAvailableTypes() |
||
| 74 | { |
||
| 75 | return [ |
||
| 76 | self::TYPE_LEAGUE, |
||
| 77 | self::TYPE_KNOCK_OUT, |
||
| 78 | self::TYPE_MULTISTAGE |
||
| 79 | ]; |
||
| 80 | } |
||
| 81 | |||
| 82 | /** |
||
| 83 | * @return array |
||
| 84 | */ |
||
| 85 | public static function getAvailableStatuses() |
||
| 86 | { |
||
| 87 | return [ |
||
| 88 | self::STATUS_DRAFT, |
||
| 89 | self::STATUS_STARTED, |
||
| 90 | self::STATUS_COMPLETED, |
||
| 91 | self::STATUS_DELETED |
||
| 92 | ]; |
||
| 93 | } |
||
| 94 | |||
| 95 | /** |
||
| 96 | * Group matches in tournament into pairs |
||
| 97 | * |
||
| 98 | * @return Collection |
||
| 99 | */ |
||
| 100 | public function getPairs() |
||
| 101 | { |
||
| 102 | // get pairs of current round matches |
||
| 103 | $pairs = new Collection(); |
||
| 104 | |||
| 105 | $this->matches->map(function ($match) use ($pairs) { |
||
| 106 | |||
| 107 | $pairId = [$match->homeTournamentTeam->id, $match->awayTournamentTeam->id]; |
||
| 108 | sort($pairId); |
||
| 109 | $pairId = implode('-', $pairId); |
||
| 110 | |||
| 111 | $pair = $pairs->pull($pairId); |
||
| 112 | |||
| 113 | if (!$pair) { |
||
| 114 | $teams = new Collection([ |
||
| 115 | $match->homeTournamentTeam->with('Team')->get(), |
||
| 116 | $match->awayTournamentTeam->with('Team')->get() |
||
| 117 | ]); |
||
| 118 | |||
| 119 | $pair = new Collection([ |
||
| 120 | 'id' => $pairId, |
||
| 121 | 'round' => $match->round, |
||
| 122 | 'teams' => $teams, |
||
| 123 | 'matches' => new Collection() |
||
| 124 | ]); |
||
| 125 | } |
||
| 126 | |||
| 127 | $pair->get('matches')->push($match); |
||
| 128 | |||
| 129 | $pairs->put($pairId, $pair); |
||
| 130 | }); |
||
| 131 | |||
| 132 | return $pairs; |
||
| 133 | } |
||
| 134 | |||
| 135 | private function matchScore($match, $homeTeam, $awayTeam) |
||
| 136 | { |
||
| 137 | if (Match::STATUS_FINISHED == $match->status) { |
||
| 138 | $homeTeam['matches']++; |
||
| 139 | $awayTeam['matches']++; |
||
| 140 | $homeTeam['goalsScored'] += $match->homeScore; |
||
| 141 | $homeTeam['goalsAgainsted'] += $match->awayScore; |
||
| 142 | $homeTeam['goalsDifference'] = ($homeTeam['goalsScored'] - $homeTeam['goalsAgainsted']); |
||
| 143 | |||
| 144 | $awayTeam['goalsScored'] += $match->awayScore; |
||
| 145 | $awayTeam['goalsAgainsted'] += $match->homeScore; |
||
| 146 | $awayTeam['goalsDifference'] = ($awayTeam['goalsScored'] - $awayTeam['goalsAgainsted']); |
||
| 147 | |||
| 148 | switch ($match->resultType) { |
||
| 149 | View Code Duplication | case Match::RESULT_TYPE_HOME_WIN: |
|
| 150 | $homeTeam['wins']++; |
||
| 151 | $homeTeam['points'] += Match::POINTS_WIN; |
||
| 152 | $awayTeam['losts']++; |
||
| 153 | |||
| 154 | break; |
||
| 155 | View Code Duplication | case Match::RESULT_TYPE_AWAY_WIN: |
|
| 156 | $awayTeam['wins']++; |
||
| 157 | $homeTeam['losts']++; |
||
| 158 | $awayTeam['points'] += Match::POINTS_WIN; |
||
| 159 | |||
| 160 | break; |
||
| 161 | View Code Duplication | case Match::RESULT_TYPE_DRAW: |
|
| 162 | $homeTeam['draws']++; |
||
| 163 | $awayTeam['draws']++; |
||
| 164 | $homeTeam['points'] += Match::POINTS_DRAW; |
||
| 165 | $awayTeam['points'] += Match::POINTS_DRAW; |
||
| 166 | |||
| 167 | break; |
||
| 168 | } |
||
| 169 | } |
||
| 170 | |||
| 171 | return ['homeTeam' => $homeTeam, 'awayTeam' => $awayTeam]; |
||
| 172 | } |
||
| 173 | |||
| 174 | /** |
||
| 175 | * @todo Make a refactoring for `pair` entity |
||
| 176 | * @name getScore |
||
| 177 | * @param Collection $matches |
||
| 178 | * @return Collection|static |
||
| 179 | */ |
||
| 180 | public function getScore(Collection $matches) |
||
| 181 | { |
||
| 182 | $score = new Collection(); |
||
| 183 | |||
| 184 | $matches->map(function ($match) use ($score) { |
||
| 185 | |||
| 186 | $homeTeam = $score->pull($match->homeTournamentTeam->id); |
||
| 187 | $awayTeam = $score->pull($match->awayTournamentTeam->id); |
||
| 188 | |||
| 189 | $defaultTeamData = [ |
||
| 190 | 'matches' => 0, |
||
| 191 | 'position' => 0, |
||
| 192 | 'wins' => 0, |
||
| 193 | 'draws' => 0, |
||
| 194 | 'losts' => 0, |
||
| 195 | 'points' => 0, |
||
| 196 | 'goalsScored' => 0, |
||
| 197 | 'goalsAgainsted' => 0, |
||
| 198 | 'goalsDifference' => 0, |
||
| 199 | ]; |
||
| 200 | |||
| 201 | if (!$homeTeam) { |
||
| 202 | $homeTeam = array_merge( |
||
| 203 | [ |
||
| 204 | 'teamId' => $match->homeTournamentTeam->id, |
||
| 205 | 'name' => $match->homeTournamentTeam->team->name, |
||
| 206 | ], |
||
| 207 | $defaultTeamData |
||
| 208 | ); |
||
| 209 | } |
||
| 210 | |||
| 211 | if (!$awayTeam) { |
||
| 212 | $awayTeam = array_merge( |
||
| 213 | [ |
||
| 214 | 'teamId' => $match->awayTournamentTeam->id, |
||
| 215 | 'name' => $match->awayTournamentTeam->team->name, |
||
| 216 | ], |
||
| 217 | $defaultTeamData |
||
| 218 | ); |
||
| 219 | } |
||
| 220 | |||
| 221 | $teams =$this->matchScore($match, $homeTeam, $awayTeam); |
||
| 222 | $score->put($match->homeTournamentTeam->id, $teams['homeTeam']); |
||
| 223 | $score->put($match->awayTournamentTeam->id, $teams['awayTeam']); |
||
| 224 | }); |
||
| 225 | |||
| 226 | // sort by points and goal difference |
||
| 227 | $score = $score->sort(function ($a, $b) { |
||
| 228 | if ($b['points'] === $a['points']) { |
||
| 229 | return $b['goalsDifference'] - $a['goalsDifference']; |
||
| 230 | } |
||
| 231 | |||
| 232 | return $b['points'] - $a['points']; |
||
| 233 | }); |
||
| 234 | |||
| 235 | $previousRow = null; |
||
| 236 | $position = 1; |
||
| 237 | $score = $score->map(function ($row) use (&$previousRow, &$position) { |
||
| 238 | if ($previousRow |
||
| 239 | && $previousRow['points'] > 0 |
||
| 240 | && $previousRow['points'] == $row['points'] |
||
| 241 | && $previousRow['goalsDifference'] == $row['goalsDifference'] |
||
| 242 | && $previousRow['goalsScored'] == $row['goalsScored'] |
||
| 243 | ) { |
||
| 244 | $row['position'] = $previousRow['position']; |
||
| 245 | } else { |
||
| 246 | $row['position'] = $position; |
||
| 247 | } |
||
| 248 | |||
| 249 | $position++; |
||
| 250 | |||
| 251 | $previousRow = $row; |
||
| 252 | |||
| 253 | return $row; |
||
| 254 | }); |
||
| 255 | |||
| 256 | // alphabetical sort for teams on the same position |
||
| 257 | $score = $score->sortBy(function ($team) { |
||
| 258 | return $team['position'] . '-' . $team['name']; |
||
| 259 | }, SORT_NUMERIC); |
||
| 260 | |||
| 261 | return $score; |
||
| 262 | } |
||
| 263 | |||
| 264 | /** |
||
| 265 | * @name getWinner |
||
| 266 | * @param Collection $matches |
||
| 267 | * @return mixed |
||
| 268 | */ |
||
| 269 | public function getWinner(Collection $matches) |
||
| 270 | { |
||
| 271 | return $this->getScore($matches)->first(); |
||
|
0 ignored issues
–
show
|
|||
| 272 | } |
||
| 273 | |||
| 274 | /** |
||
| 275 | * @return int |
||
| 276 | */ |
||
| 277 | public function getCurrentRound() |
||
| 278 | { |
||
| 279 | $matches = $this->matches()->get(); |
||
| 280 | |||
| 281 | if ($matches->count() === 0) { |
||
| 282 | return 0; |
||
| 283 | } else { |
||
| 284 | return $matches->pluck('round')->max(); |
||
| 285 | } |
||
| 286 | } |
||
| 287 | } |
||
| 288 |
It seems like the method you are trying to call exists only in some of the possible types.
Let’s take a look at an example:
Available Fixes
Add an additional type-check:
Only allow a single type to be passed if the variable comes from a parameter: