Added inern app integration

This commit is contained in:
2026-09-02 09:37:11 +02:00
parent 8aa6428089
commit e58a398c07
30 changed files with 1059 additions and 68 deletions
@@ -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;
}
}