validate([ 'comment' => 'string', 'forfeit' => 'boolean', 'round_id' => 'required|exists:App\\Models\\Round,id', 'time' => 'numeric', 'user_id' => 'required|exists:App\\Models\\User,id', 'vod' => 'string|url', ]); $round = Round::findOrFail($validatedData['round_id']); if ($validatedData['user_id'] != $request->user()->id) { $this->authorize('create', Result::class); } $result = Result::firstOrCreate([ 'round_id' => $validatedData['round_id'], 'user_id' => $validatedData['user_id'], ]); if (!$round->locked) { if (isset($validatedData['forfeit'])) $result->forfeit = $validatedData['forfeit']; if (isset($validatedData['time'])) $result->time = $validatedData['time']; } $result->comment = !empty($validatedData['comment']) ? $validatedData['comment'] : null; $result->vod = !empty($validatedData['vod']) ? $validatedData['vod'] : null; $result->save(); if ($result->wasChanged()) { ResultChanged::dispatch($result); } if ($result->wasChanged(['forfeit', 'time'])) { Protocol::resultReported( $round->tournament, $result, $request->user(), ); DiscordBotCommand::queueResult($result); } else if ($result->wasChanged(['comment', 'vod'])) { Protocol::resultCommented( $round->tournament, $result, $request->user(), ); } $round->load('results'); $round->updatePlacement(); if ($round->tournament->hasScoreboard()) { $round->tournament->updatePlacement(); } $result->load('user'); return $result->toJson(); } }