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); }