Exemple #1
0
        private async Task <BreakoutRoomInternalState?> ApplyState(string conferenceId, BreakoutRoomsConfig?newState,
                                                                   bool createNew)
        {
            var internalState = await _repository.Get(conferenceId);

            if (internalState != null && createNew)
            {
                throw new ConcurrencyException("The breakout rooms are already open.");
            }

            if (internalState == null && newState == null)
            {
                return(null);
            }

            if (internalState?.TimerTokenId != null)
            {
                await _scheduledMediator.Remove <BreakoutRoomTimerElapsedNotification>(internalState.TimerTokenId);
            }

            if (newState == null)
            {
                await _mediator.Send(new RemoveRoomsRequest(conferenceId, internalState !.OpenedRooms));

                await _repository.Remove(conferenceId);

                return(null);
            }

            var openedRooms = internalState?.OpenedRooms ?? ImmutableList <string> .Empty;

            openedRooms = await AdjustOpenedRooms(conferenceId, newState, openedRooms);

            var timerToken = await CreateTimer(newState.Deadline, conferenceId);

            internalState = new BreakoutRoomInternalState(newState, openedRooms, timerToken);
            await _repository.Set(conferenceId, internalState);

            return(internalState);
        }
 public async ValueTask Set(string conferenceId, BreakoutRoomInternalState state)
 {
     var key = GetKey(conferenceId);
     await _database.SetAsync(key, state);
 }