示例#1
0
        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);
        }
示例#2
0
        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));
        }