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