feat: added settings in room to kick

This commit is contained in:
2026-09-06 16:06:12 +02:00
parent 1e0f5cf143
commit 817b1ce1cb
10 changed files with 439 additions and 107 deletions
@@ -180,20 +180,41 @@ class RoomParticipationService
return $player;
}
public function kick(Room $room, Player $player, User $user): void
{
$stateVersion = DB::transaction(function () use ($room, $player, $user): ?int {
public function kick(
Room $room,
Player $player,
?User $user,
?Player $currentPlayer,
): void {
$stateVersion = DB::transaction(function () use ($room, $player, $user, $currentPlayer): ?int {
$lockedRoom = Room::query()
->lockForUpdate()
->findOrFail($room->id);
abort_unless($lockedRoom->owner_id === $user->id, 403);
$lockedCurrentPlayer = $currentPlayer === null
? null
: $lockedRoom->activePlayers()
->lockForUpdate()
->find($currentPlayer->id);
$isOwner = $user !== null && $lockedRoom->owner_id === $user->id;
$participantCanManage = ! $lockedRoom->isClosed()
&& $lockedCurrentPlayer !== null
&& ($lockedCurrentPlayer->is_moderator
|| $lockedRoom->allow_participants_to_manage_rounds);
abort_unless($isOwner || $participantCanManage, 403);
$lockedPlayer = $lockedRoom->players()
->lockForUpdate()
->findOrFail($player->id);
abort_if($lockedPlayer->user_id === $lockedRoom->owner_id, 403);
abort_if(
$lockedPlayer->is_moderator
|| ($lockedRoom->owner_id !== null
&& $lockedPlayer->user_id === $lockedRoom->owner_id)
|| $lockedCurrentPlayer?->id === $lockedPlayer->id,
403,
);
if ($lockedPlayer->inactive_at !== null) {
return null;