mirror of
https://github.com/ericasch6/scrum-poker-internal.git
synced 2026-10-13 20:12:10 +00:00
Added inern app integration
This commit is contained in:
@@ -101,4 +101,82 @@ 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 {
|
||||
$lockedRoom = Room::query()
|
||||
->lockForUpdate()
|
||||
->findOrFail($room->id);
|
||||
|
||||
if ($lockedRoom->isClosed()) {
|
||||
throw ValidationException::withMessages([
|
||||
'join_code' => 'Dieser Raum ist geschlossen.',
|
||||
]);
|
||||
}
|
||||
|
||||
$nameIsTaken = $lockedRoom->players()
|
||||
->where('name', $playerName)
|
||||
->where(function ($query) use ($user): void {
|
||||
$query->whereNull('user_id')
|
||||
->orWhere('user_id', '!=', $user->id);
|
||||
})
|
||||
->exists();
|
||||
|
||||
if ($nameIsTaken) {
|
||||
throw ValidationException::withMessages([
|
||||
'player_name' => 'Dieser Anzeigename ist in dem Raum bereits vorhanden.',
|
||||
]);
|
||||
}
|
||||
|
||||
$player = $lockedRoom->players()
|
||||
->where('user_id', $user->id)
|
||||
->first();
|
||||
$change = null;
|
||||
|
||||
if ($player === null) {
|
||||
$player = $lockedRoom->players()->create([
|
||||
'user_id' => $user->id,
|
||||
'name' => $playerName,
|
||||
'is_moderator' => false,
|
||||
'last_seen_at' => now(),
|
||||
]);
|
||||
$change = RoomStateChange::PlayerJoined;
|
||||
} else {
|
||||
if ($player->inactive_at !== null) {
|
||||
$change = RoomStateChange::PlayerJoined;
|
||||
} elseif ($player->name !== $playerName) {
|
||||
$change = RoomStateChange::PlayerUpdated;
|
||||
}
|
||||
|
||||
$player->update([
|
||||
'name' => $playerName,
|
||||
'last_seen_at' => now(),
|
||||
'inactive_at' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
if ($change === null) {
|
||||
return [$player, null, null];
|
||||
}
|
||||
|
||||
$lockedRoom->update([
|
||||
'last_activity_at' => now(),
|
||||
'state_version' => $lockedRoom->state_version + 1,
|
||||
]);
|
||||
|
||||
return [$player, $change, $lockedRoom->state_version];
|
||||
});
|
||||
|
||||
if ($change instanceof RoomStateChange && is_int($stateVersion)) {
|
||||
RoomStateChanged::dispatch(
|
||||
$room->id,
|
||||
$stateVersion,
|
||||
$change,
|
||||
$this->realtimeState->for($room),
|
||||
);
|
||||
}
|
||||
|
||||
return $player;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user