Files
scrum-poker-internal/app/Http/Middleware/EnsureRoomParticipant.php
T
2026-08-20 23:00:47 +02:00

86 lines
2.2 KiB
PHP

<?php
namespace App\Http\Middleware;
use App\Models\Room;
use Closure;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Symfony\Component\HttpFoundation\Response;
class EnsureRoomParticipant
{
/**
* Handle an incoming request.
*
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
$room = $request->route('room');
if (! $room instanceof Room) {
abort(404);
}
$sessionKey = "room_players.{$room->id}";
if ($room->trashed()) {
$request->session()->forget($sessionKey);
Inertia::flash('toast', [
'type' => 'info',
'message' => 'Dieser Raum wurde gelöscht.',
]);
return to_route('home');
}
if ($room->isClosed()) {
return to_route('room.join', [
'join_code' => $room->join_code,
])->withErrors([
'join_code' => 'Dieser Raum ist geschlossen.',
]);
}
$playerId = $request->session()->get($sessionKey);
$player = is_numeric($playerId)
? $room->players()->find((int) $playerId)
: null;
if ($player === null && $playerId) {
$request->session()->forget($sessionKey);
}
if ($player === null && $request->user() !== null) {
$player = $room->players()
->where('user_id', $request->user()->id)
->first();
if ($player !== null) {
$request->session()->put($sessionKey, $player->id);
}
}
if ($player === null) {
return to_route('room.join', [
'join_code' => $room->join_code,
])->withErrors([
'join_code' => 'Du musst diesem Raum erst beitreten.',
]);
}
if ($player->inactive_at !== null) {
return to_route('room.join', [
'join_code' => $room->join_code,
]);
}
$player->markAsSeen();
$request->attributes->set('currentPlayer', $player);
return $next($request);
}
}