public async Task <IActionResult> StartConsultationAsync(StartPrivateConsultationRequest request) { try { var username = User.Identity.Name?.ToLower().Trim(); var conference = await GetConference(request.ConferenceId); var requestedBy = conference.Participants?.SingleOrDefault(x => x.Id == request.RequestedBy && x.Username.Trim().Equals(username, StringComparison.CurrentCultureIgnoreCase)); if (requestedBy == null) { _logger.LogWarning("The participant with Id: {RequestedBy} and username: {Username} is not found", request.RequestedBy, username); return(NotFound()); } var consultationRequestMapper = _mapperFactory.Get <StartPrivateConsultationRequest, StartConsultationRequest>(); var mappedRequest = consultationRequestMapper.Map(request); if (request.RoomType == Contract.Enums.VirtualCourtRoomType.Participant) { var room = await _videoApiClient.CreatePrivateConsultationAsync(mappedRequest); await _consultationNotifier.NotifyRoomUpdateAsync(conference, new Room { Label = room.Label, Locked = room.Locked, ConferenceId = conference.Id }); foreach (var participantId in request.InviteParticipants.Where(participantId => conference.Participants.Any(p => p.Id == participantId))) { await _consultationNotifier.NotifyConsultationRequestAsync(conference, room.Label, request.RequestedBy, participantId); } var validSelectedEndpoints = request.InviteEndpoints .Select(endpointId => conference.Endpoints.SingleOrDefault(p => p.Id == endpointId)) .Where(x => x != null && x.DefenceAdvocateUsername.Equals(username, StringComparison.OrdinalIgnoreCase)); foreach (var endpoint in validSelectedEndpoints) { try { await _videoApiClient.JoinEndpointToConsultationAsync(new EndpointConsultationRequest { ConferenceId = request.ConferenceId, RequestedById = requestedBy.Id, EndpointId = endpoint.Id, RoomLabel = room.Label }); break; } catch (VideoApiException e) { await _consultationNotifier.NotifyConsultationResponseAsync(conference, room.Label, endpoint.Id, ConsultationAnswer.Failed); _logger.LogError(e, "Unable to add {EndpointId} to consultation", endpoint.Id); } } } else { await _videoApiClient.StartPrivateConsultationAsync(mappedRequest); } return(Accepted()); } catch (VideoApiException e) { _logger.LogError(e, "Start consultation error Conference"); return(StatusCode(e.StatusCode)); } }