Beispiel #1
0
        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));
            }
        }