mirror of
https://github.com/ericasch6/scrum-poker-internal.git
synced 2026-10-13 20:12:10 +00:00
51 lines
1.3 KiB
PHP
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),
|
|
);
|
|
}
|
|
}
|