Files
scrum-poker-internal/app/Services/Rooms/RoomSettingsService.php
T
2026-09-02 09:37:11 +02:00

51 lines
1.3 KiB
PHP

<?php
namespace App\Services\Rooms;
use App\Enums\RoomStateChange;
use App\Events\RoomStateChanged;
use App\Models\Room;
use App\Models\User;
use Illuminate\Support\Facades\DB;
class RoomSettingsService
{
public function __construct(
private readonly RoomRealtimeStateService $realtimeState,
) {}
/** @param array{allow_participants_to_manage_rounds: bool, is_persistent: bool} $settings */
public function update(Room $room, User $user, array $settings): void
{
$stateVersion = DB::transaction(function () use ($room, $user, $settings): ?int {
$lockedRoom = Room::query()
->lockForUpdate()
->findOrFail($room->id);
abort_unless($lockedRoom->owner_id === $user->id, 403);
$lockedRoom->fill($settings);
if (! $lockedRoom->isDirty()) {
return null;
}
$lockedRoom->state_version++;
$lockedRoom->save();
return $lockedRoom->state_version;
});
if ($stateVersion === null) {
return;
}
RoomStateChanged::dispatch(
$room->id,
$stateVersion,
RoomStateChange::RoomSettingsUpdated,
$this->realtimeState->for($room),
);
}
}