]> git.localhorst.tv Git - alttp.git/blob - app/Http/Controllers/ResultController.php
server calculated scoring
[alttp.git] / app / Http / Controllers / ResultController.php
1 <?php
2
3 namespace App\Http\Controllers;
4
5 use App\Events\ResultChanged;
6 use App\Models\Participant;
7 use App\Models\Protocol;
8 use App\Models\Result;
9 use App\Models\Round;
10 use Illuminate\Http\Request;
11
12 class ResultController extends Controller
13 {
14
15         public function create(Request $request) {
16                 $validatedData = $request->validate([
17                         'forfeit' => 'boolean',
18                         'participant_id' => 'required|exists:App\\Models\\Participant,id',
19                         'round_id' => 'required|exists:App\\Models\\Round,id',
20                         'time' => 'required_if:forfeit,false|numeric',
21                 ]);
22                 error_log(var_export($validatedData, true));
23
24                 $participant = Participant::findOrFail($validatedData['participant_id']);
25                 $round = Round::findOrFail($validatedData['round_id']);
26                 if (!$round || $round->locked) {
27                         abort(403);
28                 }
29
30                 $user = $request->user();
31                 if ($user->id != $participant->user->id) {
32                         $this->authorize('create', Result::class);
33                 }
34
35                 $result = Result::updateOrCreate([
36                         'round_id' => $validatedData['round_id'],
37                         'user_id' => $participant->user_id,
38                 ], [
39                         'forfeit' => $validatedData['forfeit'],
40                         'time' => isset($validatedData['time']) ? $validatedData['time'] : 0,
41                 ]);
42                 if ($result->wasChanged()) {
43                         ResultChanged::dispatch($result);
44                 }
45                 $round->load('results');
46                 $round->updatePlacement();
47                 $round->tournament->updatePlacement();
48
49                 Protocol::resultReported(
50                         $round->tournament,
51                         $result,
52                         $request->user(),
53                 );
54
55                 return $result->toJson();
56         }
57
58 }