mirror of
https://github.com/ericasch6/scrum-poker-internal.git
synced 2026-10-13 16:12:09 +00:00
do not need login
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Room;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
@@ -15,11 +16,27 @@ class EmbeddedLogoutController extends Controller
|
||||
{
|
||||
$joinCode = $request->string('join_code')->trim()->upper()->toString();
|
||||
$playerName = $request->string('player_name')->trim()->toString();
|
||||
$room = Room::query()->where('join_code', $joinCode)->first();
|
||||
$playerId = null;
|
||||
|
||||
if ($room !== null) {
|
||||
$sessionPlayerId = $request->session()->get("room_players.{$room->id}");
|
||||
|
||||
if (is_numeric($sessionPlayerId)) {
|
||||
$playerId = $room->players()
|
||||
->whereKey((int) $sessionPlayerId)
|
||||
->value('id');
|
||||
}
|
||||
}
|
||||
|
||||
Auth::guard('web')->logout();
|
||||
$request->session()->invalidate();
|
||||
$request->session()->regenerateToken();
|
||||
|
||||
if ($room !== null && is_numeric($playerId)) {
|
||||
$request->session()->put("room_players.{$room->id}", (int) $playerId);
|
||||
}
|
||||
|
||||
return to_route('embedded.room', [
|
||||
'join_code' => $joinCode,
|
||||
'player_name' => $playerName,
|
||||
|
||||
@@ -6,7 +6,6 @@ use App\Http\Requests\ShowEmbeddedRoomRequest;
|
||||
use App\Http\Resources\CurrentPlayerResource;
|
||||
use App\Http\Resources\RoomResource;
|
||||
use App\Models\Room;
|
||||
use App\Models\User;
|
||||
use App\Services\Rooms\RoomPageService;
|
||||
use App\Services\Rooms\RoomParticipationService;
|
||||
use Inertia\Inertia;
|
||||
@@ -25,8 +24,6 @@ class EmbeddedRoomController extends Controller
|
||||
$validated = $request->validated();
|
||||
$user = $request->user();
|
||||
|
||||
abort_unless($user instanceof User, 403);
|
||||
|
||||
$room = Room::query()
|
||||
->where('join_code', $validated['join_code'])
|
||||
->firstOrFail();
|
||||
@@ -34,10 +31,10 @@ class EmbeddedRoomController extends Controller
|
||||
$room,
|
||||
$user,
|
||||
$validated['player_name'],
|
||||
$request->session()->get("room_players.{$room->id}"),
|
||||
);
|
||||
|
||||
$request->session()->put("room_players.{$room->id}", $player->id);
|
||||
$request->session()->forget('embedded_login');
|
||||
|
||||
$pageData = $this->roomPage->prepare($room, $player, $user);
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class ShowEmbeddedRoomRequest extends FormRequest
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return $this->user() !== null;
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function prepareForValidation(): void
|
||||
@@ -67,17 +67,28 @@ class ShowEmbeddedRoomRequest extends FormRequest
|
||||
return;
|
||||
}
|
||||
|
||||
if ($room === null || $this->user() === null) {
|
||||
if ($room === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$sessionPlayerId = $this->session()->get("room_players.{$room->id}");
|
||||
$existingPlayer = is_numeric($sessionPlayerId)
|
||||
? $room->players()->find((int) $sessionPlayerId)
|
||||
: null;
|
||||
|
||||
if ($existingPlayer === null && $this->user() !== null) {
|
||||
$existingPlayer = $room->players()
|
||||
->where('user_id', $this->user()->id)
|
||||
->first();
|
||||
}
|
||||
|
||||
$nameIsTaken = Player::query()
|
||||
->where('room_id', $room->id)
|
||||
->where('name', $this->input('player_name'))
|
||||
->where(function ($query): void {
|
||||
$query->whereNull('user_id')
|
||||
->orWhere('user_id', '!=', $this->user()->id);
|
||||
})
|
||||
->when(
|
||||
$existingPlayer !== null,
|
||||
fn ($query) => $query->whereKeyNot($existingPlayer->id),
|
||||
)
|
||||
->exists();
|
||||
|
||||
if ($nameIsTaken) {
|
||||
|
||||
@@ -51,7 +51,6 @@ class FortifyServiceProvider extends ServiceProvider
|
||||
Fortify::loginView(fn (Request $request) => Inertia::render('auth/Login', [
|
||||
'canResetPassword' => Features::enabled(Features::resetPasswords()),
|
||||
'status' => $request->session()->get('status'),
|
||||
'rememberByDefault' => $request->session()->get('embedded_login', false),
|
||||
]));
|
||||
|
||||
Fortify::resetPasswordView(fn (Request $request) => Inertia::render('auth/ResetPassword', [
|
||||
|
||||
@@ -102,9 +102,13 @@ class RoomParticipationService
|
||||
return [$room, $player];
|
||||
}
|
||||
|
||||
public function joinEmbedded(Room $room, User $user, string $playerName): Player
|
||||
{
|
||||
[$player, $change, $stateVersion] = DB::transaction(function () use ($room, $user, $playerName): array {
|
||||
public function joinEmbedded(
|
||||
Room $room,
|
||||
?User $user,
|
||||
string $playerName,
|
||||
mixed $sessionPlayerId,
|
||||
): Player {
|
||||
[$player, $change, $stateVersion] = DB::transaction(function () use ($room, $user, $playerName, $sessionPlayerId): array {
|
||||
$lockedRoom = Room::query()
|
||||
->lockForUpdate()
|
||||
->findOrFail($room->id);
|
||||
@@ -115,12 +119,18 @@ class RoomParticipationService
|
||||
]);
|
||||
}
|
||||
|
||||
$player = $this->findExistingEmbeddedPlayer(
|
||||
$lockedRoom,
|
||||
$user,
|
||||
$sessionPlayerId,
|
||||
);
|
||||
|
||||
$nameIsTaken = $lockedRoom->players()
|
||||
->where('name', $playerName)
|
||||
->where(function ($query) use ($user): void {
|
||||
$query->whereNull('user_id')
|
||||
->orWhere('user_id', '!=', $user->id);
|
||||
})
|
||||
->when(
|
||||
$player !== null,
|
||||
fn ($query) => $query->whereKeyNot($player->id),
|
||||
)
|
||||
->exists();
|
||||
|
||||
if ($nameIsTaken) {
|
||||
@@ -129,14 +139,11 @@ class RoomParticipationService
|
||||
]);
|
||||
}
|
||||
|
||||
$player = $lockedRoom->players()
|
||||
->where('user_id', $user->id)
|
||||
->first();
|
||||
$change = null;
|
||||
|
||||
if ($player === null) {
|
||||
$player = $lockedRoom->players()->create([
|
||||
'user_id' => $user->id,
|
||||
'user_id' => $user?->id,
|
||||
'name' => $playerName,
|
||||
'is_moderator' => false,
|
||||
'last_seen_at' => now(),
|
||||
@@ -149,11 +156,24 @@ class RoomParticipationService
|
||||
$change = RoomStateChange::PlayerUpdated;
|
||||
}
|
||||
|
||||
$player->update([
|
||||
$updates = [
|
||||
'name' => $playerName,
|
||||
'last_seen_at' => now(),
|
||||
'inactive_at' => null,
|
||||
]);
|
||||
];
|
||||
|
||||
if (
|
||||
$user !== null
|
||||
&& $player->user_id === null
|
||||
&& ! $lockedRoom->players()
|
||||
->where('user_id', $user->id)
|
||||
->whereKeyNot($player->id)
|
||||
->exists()
|
||||
) {
|
||||
$updates['user_id'] = $user->id;
|
||||
}
|
||||
|
||||
$player->update($updates);
|
||||
}
|
||||
|
||||
if ($change === null) {
|
||||
@@ -180,6 +200,32 @@ class RoomParticipationService
|
||||
return $player;
|
||||
}
|
||||
|
||||
private function findExistingEmbeddedPlayer(
|
||||
Room $room,
|
||||
?User $user,
|
||||
mixed $sessionPlayerId,
|
||||
): ?Player {
|
||||
if (is_numeric($sessionPlayerId)) {
|
||||
$sessionPlayer = $room->players()
|
||||
->whereKey((int) $sessionPlayerId)
|
||||
->lockForUpdate()
|
||||
->first();
|
||||
|
||||
if ($sessionPlayer !== null) {
|
||||
return $sessionPlayer;
|
||||
}
|
||||
}
|
||||
|
||||
if ($user === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $room->players()
|
||||
->where('user_id', $user->id)
|
||||
->lockForUpdate()
|
||||
->first();
|
||||
}
|
||||
|
||||
public function kick(
|
||||
Room $room,
|
||||
Player $player,
|
||||
|
||||
Reference in New Issue
Block a user