user(); $decks = Deck::query() ->where(function ($query) use ($user) { $query->where('is_system', true); if ($user !== null) { $query->orWhere('user_id', $user->id); } }) ->orderBy('name') ->get([ 'id', 'name', 'cards', ]); return Inertia::render('rooms/Create', [ 'decks' => $decks, 'defaultPlayerName' => $user?->name, ]); } public function store(Request $request, StoreRoomRequest $roomStoreRequest) { $validated = $roomStoreRequest->validated(); $user = $request->user(); $deck = Deck::query() ->whereKey($validated['deck_id']) ->where(function ($query) use ($user) { $query->where('is_system', true); if ($user !== null) { $query->orWhere('user_id', $user->id); } }) ->firstOrFail(); [$room, $player] = DB::transaction(function () use ( $validated, $deck, $user, ) { $room = Room::create([ 'title' => $validated['title'] ?? null, 'deck_config' => [ 'id' => $deck->id, 'name' => $deck->name, 'cards' => $deck->cards, ], ]); $player = $room->players()->create([ 'user_id' => $user?->id, 'name' => $validated['player_name'], 'is_moderator' => true, 'last_seen_at' => now(), ]); return [$room, $player]; }); $request->session()->put( "room_players.{$room->id}", $player->id, ); return to_route('room.show', $room); } public function show(Room $room, Request $request) { $currentPlayer = $request->attributes->get('currentPlayer'); abort_unless($currentPlayer instanceof Player, 403); $room->load([ 'players' => fn ($query) => $query ->select(['id', 'room_id', 'name', 'is_moderator', 'created_at']) ->orderByDesc('is_moderator') ->orderBy('created_at'), 'players.votes' => fn ($query) => $query ->where('room_id', $room->id) ->where('round', $room->current_round), ]); $players = $room->players->map(function (Player $player) use ($room) { $vote = $player->votes->first(); return [ 'id' => $player->id, 'name' => $player->name, 'is_moderator' => $player->is_moderator, 'has_voted' => $vote !== null, 'vote' => $room->revealed_at !== null ? $vote?->value : null, ]; }); $currentVote = $room->players ->firstWhere('id', $currentPlayer->id) ?->votes ->first(); return Inertia::render('rooms/Show', [ 'room' => [ 'id' => $room->id, 'title' => $room->title, 'join_code' => $room->join_code, 'current_round' => $room->current_round, 'revealed' => $room->revealed_at !== null, 'state_version' => $room->state_version, 'deck' => [ 'name' => $room->deck_config['name'], 'cards' => $room->deck_config['cards'], ], 'players' => $players, ], 'currentPlayer' => [ 'id' => $currentPlayer->id, 'name' => $currentPlayer->name, 'is_moderator' => $currentPlayer->is_moderator, 'current_vote' => $currentVote?->value, ], ]); } public function join(Request $request) { return Inertia::render('rooms/Join', [ 'join_code' => $request->query('join_code'), ]); } }