public async Task <Unit> Handle(UpdateScenesRequest request, CancellationToken cancellationToken) { var(conferenceId, roomId) = request; await using (await _sceneRepository.LockScene(conferenceId, roomId)) { var scene = await _sceneRepository.GetScene(conferenceId, roomId); scene ??= SynchronizedSceneProvider.GetDefaultActiveScene(); var state = await _sceneRepository.GetSceneState(conferenceId, roomId); state ??= SynchronizedSceneProvider.GetEmptySceneState(); await ApplyScene(conferenceId, roomId, scene, state); } await _mediator.Send( new UpdateSynchronizedObjectRequest(conferenceId, SynchronizedScene.SyncObjId(roomId))); return(Unit.Value); }
public async ValueTask Handle(string conferenceId, string roomId, Func <ActiveScene, ActiveScene> patchFunc) { await using (await _sceneRepository.LockScene(conferenceId, roomId)) { var previousScene = await _sceneRepository.GetScene(conferenceId, roomId); previousScene ??= SynchronizedSceneProvider.GetDefaultActiveScene(); await _sceneRepository.SetScene(conferenceId, roomId, patchFunc(previousScene)); } // for optimistic concurrency await _mediator.Send(new ClearCacheRequest()); if (!await IsRoomExisting(conferenceId, roomId)) { await _sceneRepository.RemoveScene(conferenceId, roomId); throw SceneError.RoomNotFound.ToException(); } await _mediator.Send(new UpdateScenesRequest(conferenceId, roomId)); }