fix: refactored the codebase

This commit is contained in:
2026-08-20 23:00:47 +02:00
parent 6f47ed0674
commit a77f74911d
64 changed files with 2864 additions and 1739 deletions
+37 -142
View File
@@ -2,156 +2,51 @@
namespace App\Http\Controllers;
use App\Enums\RoomStateChange;
use App\Events\RoomStateChanged;
use App\Models\Player;
use App\Models\Room;
use App\Models\Vote;
use App\Services\Rooms\RoundService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
class RoundController extends Controller
{
public function reset(
Request $request,
Room $room,
): RedirectResponse {
$player = $request->attributes->get('currentPlayer');
public function __construct(
private readonly RoundService $rounds,
) {}
abort_unless(
$player instanceof Player
&& $player->room_id === $room->id
&& $player->is_moderator,
403,
);
$stateVersion = DB::transaction(function () use ($room): int {
$lockedRoom = Room::query()
->lockForUpdate()
->findOrFail($room->id);
$this->ensureRoomIsOpen($lockedRoom);
Vote::query()
->where('room_id', $lockedRoom->id)
->where('round', $lockedRoom->current_round)
->delete();
$lockedRoom->update([
'revealed_at' => null,
'last_activity_at' => now(),
'state_version' => $lockedRoom->state_version + 1,
]);
return $lockedRoom->state_version;
});
RoomStateChanged::dispatch(
$room->id,
$stateVersion,
RoomStateChange::VotesReset,
);
return back();
}
public function reveal(
Request $request,
Room $room,
): RedirectResponse {
$player = $request->attributes->get('currentPlayer');
abort_unless(
$player instanceof Player
&& $player->room_id === $room->id
&& $player->is_moderator,
403,
);
$stateVersion = DB::transaction(function () use ($room): int {
$lockedRoom = Room::query()
->lockForUpdate()
->findOrFail($room->id);
$this->ensureRoomIsOpen($lockedRoom);
if ($lockedRoom->revealed_at !== null) {
throw ValidationException::withMessages([
'room' => 'Die Karten sind bereits aufgedeckt.',
]);
}
$lockedRoom->update([
'revealed_at' => now(),
'last_activity_at' => now(),
'state_version' => $lockedRoom->state_version + 1,
]);
return $lockedRoom->state_version;
});
RoomStateChanged::dispatch(
$room->id,
$stateVersion,
RoomStateChange::CardsRevealed,
);
return back();
}
public function nextRound(
Request $request,
Room $room,
): RedirectResponse {
$player = $request->attributes->get('currentPlayer');
abort_unless(
$player instanceof Player
&& $player->room_id === $room->id
&& $player->is_moderator,
403,
);
$stateVersion = DB::transaction(function () use ($room): int {
$lockedRoom = Room::query()
->lockForUpdate()
->findOrFail($room->id);
$this->ensureRoomIsOpen($lockedRoom);
if ($lockedRoom->revealed_at === null) {
throw ValidationException::withMessages([
'room' => 'Die aktuelle Runde muss zuerst aufgedeckt werden.',
]);
}
$lockedRoom->update([
'current_round' => $lockedRoom->current_round + 1,
'revealed_at' => null,
'last_activity_at' => now(),
'state_version' => $lockedRoom->state_version + 1,
]);
return $lockedRoom->state_version;
});
RoomStateChanged::dispatch(
$room->id,
$stateVersion,
RoomStateChange::NextRound,
);
return back();
}
private function ensureRoomIsOpen(Room $room): void
public function reset(Request $request, Room $room): RedirectResponse
{
if ($room->isClosed()) {
throw ValidationException::withMessages([
'room' => 'Dieser Raum ist geschlossen.',
]);
}
$this->ensureModerator($request, $room);
$this->rounds->reset($room);
return back();
}
public function reveal(Request $request, Room $room): RedirectResponse
{
$this->ensureModerator($request, $room);
$this->rounds->reveal($room);
return back();
}
public function nextRound(Request $request, Room $room): RedirectResponse
{
$this->ensureModerator($request, $room);
$this->rounds->startNext($room);
return back();
}
private function ensureModerator(Request $request, Room $room): void
{
$player = $request->attributes->get('currentPlayer');
abort_unless(
$player instanceof Player
&& $player->room_id === $room->id
&& $player->is_moderator,
403,
);
}
}