feat: added laravel reverb and websocket, also emote throwing added

This commit is contained in:
2026-08-16 17:10:42 +02:00
parent 50e9fbd0b0
commit 6f47ed0674
30 changed files with 2244 additions and 34 deletions
+30 -5
View File
@@ -2,6 +2,8 @@
namespace App\Http\Controllers;
use App\Enums\RoomStateChange;
use App\Events\RoomStateChanged;
use App\Http\Requests\StoreRoomRequest;
use App\Models\Deck;
use App\Models\Player;
@@ -187,11 +189,13 @@ class RoomController extends Controller
abort_if($room->trashed(), 404);
abort_unless($user !== null && $user->id === $room->owner_id, 403);
$player = DB::transaction(function () use ($room, $user) {
[$player, $stateVersion, $wasReopened] = DB::transaction(function () use ($room, $user): array {
$lockedRoom = Room::query()->lockForUpdate()->findOrFail($room->id);
abort_unless($user->id === $lockedRoom->owner_id, 403);
$wasReopened = $lockedRoom->isClosed();
if ($lockedRoom->isClosed()) {
$lockedRoom->update([
'current_round' => $lockedRoom->current_round + 1,
@@ -202,13 +206,25 @@ class RoomController extends Controller
]);
}
return $lockedRoom->players()
->where('user_id', $user->id)
->firstOrFail();
return [
$lockedRoom->players()
->where('user_id', $user->id)
->firstOrFail(),
$lockedRoom->state_version,
$wasReopened,
];
});
$request->session()->put("room_players.{$room->id}", $player->id);
if ($wasReopened) {
RoomStateChanged::dispatch(
$room->id,
$stateVersion,
RoomStateChange::RoomReopened,
);
}
return to_route('room.show', $room);
}
@@ -219,7 +235,7 @@ class RoomController extends Controller
abort_if($room->trashed(), 404);
abort_unless($user !== null && $user->id === $room->owner_id, 403);
DB::transaction(function () use ($room, $user): void {
$stateVersion = DB::transaction(function () use ($room, $user): int {
$lockedRoom = Room::withTrashed()
->lockForUpdate()
->findOrFail($room->id);
@@ -231,9 +247,18 @@ class RoomController extends Controller
'state_version' => $lockedRoom->state_version + 1,
]);
$lockedRoom->delete();
return $lockedRoom->state_version;
});
$request->session()->forget("room_players.{$room->id}");
RoomStateChanged::dispatch(
$room->id,
$stateVersion,
RoomStateChange::RoomDeleted,
);
Inertia::flash('toast', [
'type' => 'success',
'message' => 'Der Raum wurde gelöscht.',