mirror of
https://github.com/ericasch6/scrum-poker-internal.git
synced 2026-10-13 15:32:09 +00:00
do not need login
This commit is contained in:
@@ -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