Add room participant moderation

This commit is contained in:
2026-09-03 11:35:05 +02:00
parent e30d2e61aa
commit 2f05e56089
14 changed files with 453 additions and 15 deletions
@@ -15,6 +15,12 @@ class DashboardRoomService
{
$ownedRooms = $user
->ownedRooms()
->with([
'activePlayers' => fn ($query) => $query
->select(['id', 'room_id', 'user_id', 'name', 'is_moderator', 'created_at'])
->orderByDesc('is_moderator')
->orderBy('created_at'),
])
->withCount('players')
->withCount(['activePlayers as active_player_count'])
->orderByRaw('closed_at IS NOT NULL')
@@ -179,4 +179,47 @@ class RoomParticipationService
return $player;
}
public function kick(Room $room, Player $player, User $user): void
{
$stateVersion = DB::transaction(function () use ($room, $player, $user): ?int {
$lockedRoom = Room::query()
->lockForUpdate()
->findOrFail($room->id);
abort_unless($lockedRoom->owner_id === $user->id, 403);
$lockedPlayer = $lockedRoom->players()
->lockForUpdate()
->findOrFail($player->id);
abort_if($lockedPlayer->user_id === $lockedRoom->owner_id, 403);
if ($lockedPlayer->inactive_at !== null) {
return null;
}
$lockedPlayer->update([
'inactive_at' => now(),
]);
$lockedRoom->update([
'last_activity_at' => now(),
'state_version' => $lockedRoom->state_version + 1,
]);
return $lockedRoom->state_version;
});
if ($stateVersion === null) {
return;
}
RoomStateChanged::dispatch(
$room->id,
$stateVersion,
RoomStateChange::PlayerKicked,
$this->realtimeState->for($room),
$player->id,
);
}
}