Example #1
0
        public async Task NotifyConsultationResponseAsync(Conference conference, string roomLabel, Guid requestedForId,
                                                          ConsultationAnswer answer)
        {
            var endpoint = conference.Endpoints.FirstOrDefault(e => e.Id == requestedForId);

            if (endpoint != null)
            {
                await PublishResponseMessage(conference, roomLabel, endpoint.Id, answer);

                return;
            }

            var participantFor = conference.Participants.First(x => x.Id == requestedForId);
            await _consultationResponseTracker.UpdateConsultationResponse(conference, participantFor.Id, answer);

            var haveAllAccepted =
                await _consultationResponseTracker.HaveAllParticipantsAccepted(conference, participantFor.Id);

            if (answer == ConsultationAnswer.Accepted && !haveAllAccepted)
            {
                return;
            }

            await PublishResponseMessage(conference, roomLabel, participantFor.Id, answer);

            if (participantFor.LinkedParticipants.Any())
            {
                await NotifyLinkedParticipantsOfConsultationResponseAsync(conference, participantFor, roomLabel, answer);
            }

            if (answer == ConsultationAnswer.Transferring && participantFor.LinkedParticipants.Any())
            {
                await _consultationResponseTracker.ClearResponses(conference, requestedForId);
            }
        }
Example #2
0
        public async Task <IActionResult> RespondToConsultationRequestAsync(PrivateConsultationRequest request)
        {
            var conference = await GetConference(request.ConferenceId);

            var participant = conference.Participants?.SingleOrDefault(x => x.Id == request.RequestedById);

            if (participant == null && request.RequestedById != Guid.Empty)
            {
                // Participants other than VHO
                return(NotFound());
            }

            var adminConsultationRequestMapper = _mapperFactory.Get <PrivateConsultationRequest, ConsultationRequestResponse>();
            var mappedRequest = adminConsultationRequestMapper.Map(request);

            try
            {
                await _consultationNotifier.NotifyConsultationResponseAsync(conference, request.RoomLabel, request.RequestedForId, request.Answer);

                var haveAllResponded =
                    await _consultationResponseTracker.HaveAllParticipantsAccepted(conference, request.RequestedForId);

                if (request.Answer == ConsultationAnswer.Accepted && haveAllResponded)
                {
                    await _consultationNotifier.NotifyConsultationResponseAsync(conference, request.RoomLabel, request.RequestedForId, ConsultationAnswer.Transferring);
                }

                if (request.Answer != ConsultationAnswer.Accepted || haveAllResponded)
                {
                    await _videoApiClient.RespondToConsultationRequestAsync(mappedRequest);
                }

                return(NoContent());
            }
            catch (VideoApiException e)
            {
                await _consultationNotifier.NotifyConsultationResponseAsync(conference, request.RoomLabel, request.RequestedForId, ConsultationAnswer.Failed);

                _logger.LogError(e, "Consultation request could not be responded to");
                return(StatusCode(e.StatusCode, e.Response));
            }
        }