public async Task Handle(ParticipantsRoomChangedNotification notification, CancellationToken cancellationToken) { var updatedRooms = GetRoomsWithAParticipantLeft(notification); foreach (var updatedRoom in updatedRooms) { await using (await _repository.LockRoom(notification.ConferenceId, updatedRoom)) { var participants = GetParticipantsThatLeftRoom(notification, updatedRoom); await _repository.RemoveFromQueue(participants, updatedRoom); await _modeHandler.InvalidateTalkingSceneWithLockAcquired(notification.ConferenceId, updatedRoom); } await _mediator.Send(new UpdateSynchronizedObjectRequest(notification.ConferenceId, SynchronizedSceneTalkingStick.SyncObjId(updatedRoom))); } }
public async Task <Unit> Handle(TalkingStickEnqueueRequest request, CancellationToken cancellationToken) { var(participant, remove) = request; var rooms = await _mediator.FetchSynchronizedObject <SynchronizedRooms>(participant.ConferenceId, SynchronizedRooms.SyncObjId); if (!rooms.Participants.TryGetValue(participant.Id, out var roomId)) { throw SceneError.RoomNotFound.ToException(); } await using (await _repository.LockRoom(participant.ConferenceId, roomId)) { await _mediator.Send(new ClearCacheRequest()); if (!await CheckParticipantIsInRoom(participant, roomId)) { throw new ConcurrencyException("Participant switched room."); } if (remove) { await _repository.RemoveFromQueue(participant.Yield(), roomId); } else { var queue = await _repository.FetchQueue(participant.ConferenceId, roomId); if (!queue.Contains(participant.Id)) { await _repository.Enqueue(participant, roomId); } await _modeHandler.InvalidateTalkingSceneWithLockAcquired(participant.ConferenceId, roomId); } } await _mediator.Send(new UpdateSynchronizedObjectRequest(participant.ConferenceId, SynchronizedSceneTalkingStick.SyncObjId(roomId))); return(Unit.Value); }