예제 #1
0
        public async Task <IActionResult> HandleConsultationRequestAsync(PrivateConsultationRequest request)
        {
            var conference = await GetConference(request.ConferenceId);

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

            if (requestedBy == null)
            {
                return(NotFound());
            }

            var requestedFor = conference.Participants?.SingleOrDefault(x => x.Id == request.RequestedForId);

            if (requestedFor == null)
            {
                return(NotFound());
            }

            var requestRaised = !request.Answer.HasValue;

            if (requestRaised)
            {
                await NotifyConsultationRequestAsync(conference, requestedBy, requestedFor);
            }
            else if (request.Answer == ConsultationAnswer.Cancelled)
            {
                await NotifyConsultationCancelledAsync(conference, requestedBy, requestedFor);
            }
            else
            {
                await NotifyConsultationResponseAsync(conference, requestedBy, requestedFor, request.Answer.Value);
            }

            try
            {
                var mappedRequest = PrivateConsultationRequestMapper.MapToApiConsultationRequest(request);
                await _videoApiClient.HandleConsultationRequestAsync(mappedRequest);

                return(NoContent());
            }
            catch (VideoApiException e)
            {
                object value;
                if (e is VideoApiException <ProblemDetails> )
                {
                    var errors =
                        Newtonsoft.Json.JsonConvert.DeserializeObject <Dictionary <string, string[]> >(e.Response);
                    value = BadRequestResponseMapper.MapToResponse(errors);
                    await NotifyParticipantsConsultationRoomOccupied(request.ConferenceId, requestedBy.Username,
                                                                     requestedFor.Username);
                }
                else
                {
                    value = e.Response;
                }

                _logger.LogError(e, $"Consultation error ConferenceId: {request.ConferenceId} and answer {request.Answer}, ErrorCode: {e.StatusCode}");
                return(StatusCode(400, value));
            }
        }
예제 #2
0
        public static ConsultationRequest MapToApiConsultationRequest(PrivateConsultationRequest request)
        {
            ConsultationAnswer?answer = null;

            if (request.Answer.HasValue)
            {
                answer = Enum.Parse <ConsultationAnswer>(request.Answer.ToString() !);
            }

            return(new ConsultationRequest
            {
                Conference_id = request.ConferenceId,
                Requested_by = request.RequestedById,
                Requested_for = request.RequestedForId,
                Answer = answer
            });
        }
예제 #3
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));
            }
        }