Files
scrum-poker-internal/app/Http/Controllers/RoomController.php
T
Twyco 640a2970c3
CI/CD / test_and_check_app (push) Failing after 2m7s
CI/CD / Publish immutable image (push) Skipped
Handle authenticated room instance takeover
2026-09-10 16:33:13 +02:00

84 lines
2.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreRoomRequest;
use App\Http\Resources\CurrentPlayerResource;
use App\Http\Resources\DeckResource;
use App\Http\Resources\RoomResource;
use App\Models\Player;
use App\Models\Room;
use App\Services\Rooms\RoomCreationService;
use App\Services\Rooms\RoomPageService;
use App\Services\Rooms\RoomPlayerInstanceService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Inertia\Response;
class RoomController extends Controller
{
public function __construct(
private readonly RoomCreationService $roomCreation,
private readonly RoomPageService $roomPage,
private readonly RoomPlayerInstanceService $playerInstances,
) {}
public function create(Request $request): Response
{
return Inertia::render('rooms/Create', [
'decks' => DeckResource::collection(
$this->roomCreation->availableDecks($request->user()),
)->resolve($request),
'defaultPlayerName' => $request->user()?->name,
]);
}
public function store(StoreRoomRequest $request): RedirectResponse
{
/** @var array{deck_id: int, player_name: string, title?: string|null} $validated */
$validated = $request->validated();
[$room, $player] = $this->roomCreation->create(
$validated,
$request->user(),
);
$player->update([
'active_instance_id' => $this->playerInstances->for($request),
]);
$request->session()->put(
"room_players.{$room->id}",
$player->id,
);
$redirect = to_route('room.show', $room);
if ($request->user() === null) {
$redirect->with('room_notice', [
'guest_retention_days' => config('rooms.guest_retention_days'),
'account_retention_days' => config('rooms.account_retention_days'),
]);
}
return $redirect;
}
public function show(Room $room, Request $request): Response
{
$currentPlayer = $request->attributes->get('currentPlayer');
abort_unless($currentPlayer instanceof Player, 403);
$pageData = $this->roomPage->prepare(
$room,
$currentPlayer,
$request->user(),
);
return Inertia::render('rooms/Show', [
'room' => (new RoomResource($pageData))->resolve($request),
'currentPlayer' => (new CurrentPlayerResource($pageData))->resolve($request),
]);
}
}