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