Exemple #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));
            }
        }
        public void should_map_to_private_consultation_request(ConsultationAnswer?answer, Services.Video.ConsultationAnswer?expectedAnswer)
        {
            var request = Builder <PrivateConsultationRequest> .CreateNew()
                          .With(x => x.ConferenceId   = Guid.NewGuid())
                          .With(x => x.RequestedById  = Guid.NewGuid())
                          .With(x => x.RequestedForId = Guid.NewGuid())
                          .With(x => x.Answer         = answer)
                          .Build();

            var result = PrivateConsultationRequestMapper.MapToApiConsultationRequest(request);

            result.Answer.Should().Be(expectedAnswer);
            result.Conference_id.Should().Be(request.ConferenceId);
            result.Requested_by.Should().Be(request.RequestedById);
            result.Requested_for.Should().Be(request.RequestedForId);
        }