/// <summary>
        /// Creates a new adhoc online meeting.
        /// Permissions required : OnlineMeetings.ReadWrite.All.
        /// </summary>
        /// <param name="tenantId">The tenant identifier.</param>
        /// <param name="organizerId">The meeting organizer identifier.</param>
        /// <param name="correlationId">The correlation identifier - needed in case of debugging for correlating client side request with server side logs.</param>
        /// <returns> The onlinemeeting. </returns>
        public async Task <Microsoft.Graph.OnlineMeeting> CreateOnlineMeetingAsync(string tenantId, string organizerId, Guid correlationId)
        {
            var statelessClient = new DefaultContainerClient(
                this.graphEndpointUri.AbsoluteUri,
                this.GetAuthenticationProvider(tenantId, correlationId));

            var meetingRequest = statelessClient.App.OnlineMeetings.Request();

            var onlineMeeting = new Microsoft.Graph.OnlineMeeting()
            {
                MeetingType  = MeetingType.MeetNow,
                Participants = new MeetingParticipants()
                {
                    Organizer = new MeetingParticipantInfo()
                    {
                        Identity = new IdentitySet()
                        {
                            User = new Identity()
                            {
                                Id = organizerId,
                            },
                        },
                    },
                },
                Subject = "Test meeting.",
            };

            var meeting = await meetingRequest.AddAsync(onlineMeeting).ConfigureAwait(false);

            return(meeting);
        }
        /// <summary>
        /// Gets the online meeting.
        /// Permissions required : Either OnlineMeetings.Read.All or OnlineMeetings.ReadWrite.All.
        /// </summary>
        /// <param name="tenantId">The tenant identifier.</param>
        /// <param name="meetingId">The meeting identifier.</param>
        /// <param name="correlationId">The correlation identifier - needed in case of debugging for correlating client side request with server side logs.</param>
        /// <returns> The onlinemeeting. </returns>
        public async Task <Microsoft.Graph.OnlineMeeting> GetOnlineMeetingAsync(string tenantId, string meetingId, Guid correlationId)
        {
            var statelessClient = new DefaultContainerClient(
                this.graphEndpointUri.AbsoluteUri,
                this.GetAuthenticationProvider(tenantId, correlationId));

            var meetingRequest = statelessClient.App.OnlineMeetings[meetingId].Request();
            var meeting        = await meetingRequest.GetAsync().ConfigureAwait(false);

            return(meeting);
        }
        /// <summary>
        /// Gets the online meeting.
        /// </summary>
        /// <param name="tenantId">The tenant identifier.</param>
        /// <param name="meetingId">The meeting identifier.</param>
        /// <param name="correlationId">The correlation identifier.</param>
        /// <returns> The onlinemeeting. </returns>
        public async Task <Microsoft.Graph.OnlineMeeting> GetOnlineMeetingAsync(string tenantId, string meetingId, Guid correlationId)
        {
            IAuthenticationProvider GetAuthenticationProvider()
            {
                return(new DelegateAuthenticationProvider(async request =>
                {
                    request.Headers.Add(CoreConstants.Headers.ScenarioId, correlationId.ToString());
                    request.Headers.Add(CoreConstants.Headers.ClientRequestId, Guid.NewGuid().ToString());

                    await this.requestAuthenticationProvider.AuthenticateOutboundRequestAsync(request, tenantId)
                    .ConfigureAwait(false);
                }));
            }

            var statelessClient = new DefaultContainerClient(this.graphEndpointUri.AbsoluteUri, GetAuthenticationProvider());
            var meetingRequest  = statelessClient.App.OnlineMeetings[meetingId].Request();

            var meeting = await meetingRequest.GetAsync().ConfigureAwait(false);

            return(meeting);
        }