Exemple #1
0
        public async Task <HttpResponseMessage> TerminateParticipantRoute(IEnumerable <Guid> ids)
        {
            var details = (from route in DataContext.NetworkRequestRoutes
                           let network = route.Participant.Network
                                         where ids.Contains(route.SourceRequestDataMartID)
                                         select new
            {
                RequestID = route.ParticipantID,
                NetworkID = network.ID,
                NetworkName = network.Name,
                network.ServiceUrl,
                network.ServiceUserName,
                network.ServicePassword
            }).DistinctBy(c => c.RequestID).ToArray();

            if (details == null)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Unable to determine the source request details for one or more of the specified responses."));
            }

            foreach (var detail in details)
            {
                using (var pmnApi = new Dns.ApiClient.DnsClient(detail.ServiceUrl, detail.ServiceUserName, Lpp.Utilities.Crypto.DecryptString(detail.ServicePassword)))
                {
                    var resp = await pmnApi.CNDSRequests.TerminateRequest(detail.RequestID);

                    if (!resp.IsSuccessStatusCode)
                    {
                        return(Request.CreateErrorResponse(resp.StatusCode, await resp.GetMessage()));
                    }
                }
            }
            return(Request.CreateResponse(HttpStatusCode.OK));
        }
Exemple #2
0
        public async Task <HttpResponseMessage> TerminateSourceRoute(IEnumerable <Guid> ids)
        {
            foreach (var dm in ids)
            {
                var details = await(from route in DataContext.NetworkRequestRoutes
                                    let network = route.Participant.NetworkRequest.Network
                                                  where route.ID == dm
                                                  select new
                {
                    ID = network.ID,
                    network.Name,
                    network.ServiceUrl,
                    network.ServiceUserName,
                    network.ServicePassword,
                    route.SourceRequestDataMartID
                }).FirstOrDefaultAsync();

                using (var participantNetworkAPI = new Dns.ApiClient.DnsClient(details.ServiceUrl, details.ServiceUserName, Utilities.Crypto.DecryptString(details.ServicePassword)))
                {
                    var resp = await participantNetworkAPI.CNDSRequests.TerminateRoute(details.SourceRequestDataMartID);

                    if (!resp.IsSuccessStatusCode)
                    {
                        return(Request.CreateErrorResponse(resp.StatusCode, resp.ReasonPhrase));
                    }
                }
            }

            return(Request.CreateResponse(HttpStatusCode.OK));
        }
Exemple #3
0
        public async Task <HttpResponseMessage> UpdatParticipantDataMartsPriorityAndDueDates(IEnumerable <DTO.Requests.UpdateDataMartPriorityAndDueDateDTO> dtos)
        {
            foreach (var dm in dtos)
            {
                var details = await(from route in DataContext.NetworkRequestRoutes
                                    let network = route.Participant.Network
                                                  where route.SourceRequestDataMartID == dm.RequestDataMartID
                                                  select new
                {
                    ID = network.ID,
                    network.Name,
                    network.ServiceUrl,
                    network.ServiceUserName,
                    network.ServicePassword,
                    RequestDataMartID = route.ID
                }).FirstOrDefaultAsync();

                using (var participantNetworkAPI = new Dns.ApiClient.DnsClient(details.ServiceUrl, details.ServiceUserName, Utilities.Crypto.DecryptString(details.ServicePassword)))
                {
                    var resp = await participantNetworkAPI.CNDSRequests.UpdatePriorityAndDueDate(new Dns.DTO.CNDS.CNDSUpdateDataMartPriorityAndDueDateDTO {
                        RequestDataMartID = details.RequestDataMartID, DueDate = dm.DueDate, Priority = dm.Priority
                    });

                    if (!resp.IsSuccessStatusCode)
                    {
                        return(Request.CreateErrorResponse(resp.StatusCode, resp.ReasonPhrase));
                    }
                }
            }
            return(Request.CreateResponse(HttpStatusCode.OK));
        }
Exemple #4
0
        public async Task <NetworkRequestTypeMappingDTO> GetRequestTypeMapping(Guid id)
        {
            var details = await DataContext.NetworkRequestTypeMappings.Where(m => m.ID == id)
                          .Select(m => new
            {
                DTO = new NetworkRequestTypeMappingDTO
                {
                    ID            = m.ID,
                    NetworkID     = m.NetworkID,
                    Network       = m.Network.Name,
                    ProjectID     = m.ProjectID,
                    RequestTypeID = m.RequestTypeID,
                    Routes        = m.NetworkRoutes.Select(rt => new NetworkRequestTypeDefinitionDTO {
                        ID = rt.RequestTypeDefinitionID, NetworkID = rt.RequestTypeDefinition.NetworkID, Network = rt.RequestTypeDefinition.Network.Name, ProjectID = rt.RequestTypeDefinition.ProjectID, RequestTypeID = rt.RequestTypeDefinition.RequestTypeID, DataSourceID = rt.RequestTypeDefinition.DataSourceID, DataSource = rt.RequestTypeDefinition.DataSource.Name, Timestamp = rt.RequestTypeDefinition.Timestamp
                    }),
                    Timestamp = m.Timestamp
                },
                Networks = (DataContext.NetworkRequestTypeMappings.Where(mm => mm.ID == id).Select(mm => new { mm.Network.ID, mm.Network.ServiceUrl, mm.Network.ServiceUserName, mm.Network.ServicePassword })
                            .Concat(DataContext.NetworkRequestTypeDefinitions.Where(d => d.NetworkRequestTypeMappingRoutes.Any(rt => rt.RequestTypeMappingID == id) && d.NetworkID != m.NetworkID).Select(d => new { d.Network.ID, d.Network.ServiceUrl, d.Network.ServiceUserName, d.Network.ServicePassword }))).Distinct()
            }).FirstOrDefaultAsync();

            if (details == null)
            {
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "The requested network requesttype was not found."));
            }

            var networkProjectRequestTypes = (new[] { new { details.DTO.NetworkID, details.DTO.ProjectID, details.DTO.RequestTypeID } }.Concat(details.DTO.Routes.Select(r => new { r.NetworkID, r.ProjectID, r.RequestTypeID }))).Distinct();
            var networks = details.Networks.ToDictionary(k => k.ID);

            foreach (var grp in networkProjectRequestTypes.GroupBy(k => k.NetworkID))
            {
                var network = networks[grp.Key];
                using (var pmnAPI = new Dns.ApiClient.DnsClient(network.ServiceUrl, network.ServiceUserName, Utilities.Crypto.DecryptString(network.ServicePassword)))
                {
                    string odataFilter = "$filter=" + string.Join(" or ", grp.Select(n => n.ProjectID).Distinct().Select(pid => string.Format("ID eq {0:D}", pid)));
                    var    pmnProjects = await pmnAPI.Projects.List(odataFilter);

                    odataFilter = "$filter=" + string.Join(" or ", grp.Select(n => n.RequestTypeID).Distinct().Select(rid => string.Format("ID eq {0:D}", rid)));
                    var pmnRequestTypes = await pmnAPI.RequestTypes.List(odataFilter);

                    if (grp.Key == details.DTO.NetworkID)
                    {
                        details.DTO.Project     = pmnProjects.Where(p => p.ID == details.DTO.ProjectID).Select(p => p.Name).FirstOrDefault() ?? UnableToDetermineMessage;
                        details.DTO.RequestType = pmnRequestTypes.Where(rt => rt.ID == details.DTO.RequestTypeID).Select(rt => rt.Name).FirstOrDefault() ?? UnableToDetermineMessage;
                    }

                    foreach (var route in details.DTO.Routes.Where(rt => rt.NetworkID == grp.Key))
                    {
                        route.Project     = pmnProjects.Where(p => p.ID == route.ProjectID).Select(p => p.Name).FirstOrDefault() ?? UnableToDetermineMessage;
                        route.RequestType = pmnRequestTypes.Where(rt => rt.ID == route.RequestTypeID).Select(rt => rt.Name).FirstOrDefault() ?? UnableToDetermineMessage;
                    }
                }
            }

            return(details.DTO);
        }
Exemple #5
0
        public async Task <HttpResponseMessage> UpdateParticipantRoutingStatus(IEnumerable <DTO.Requests.SetRoutingStatusDTO> dtos)
        {
            var responseIDs = dtos.Select(d => d.ResponseID).Distinct();
            //the response ID specified will be from the participating network request
            var details = await(from rsp in DataContext.NetworkRequestResponses
                                let network = rsp.NetworkRequestRoute.Participant.Network
                                              where responseIDs.Contains(rsp.SourceResponseID)
                                              select new
            {
                ParticipantResponseID = rsp.ID,
                rsp.SourceResponseID,
                rsp.NetworkRequestRoute.SourceRequestDataMartID,
                NetworkID   = network.ID,
                NetworkName = network.Name,
                network.ServiceUrl,
                network.ServiceUserName,
                network.ServicePassword
            }).ToArrayAsync();

            if (details == null || details.Length < responseIDs.Count())
            {
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Unable to determine the source request details for one or more of the specified responses."));
            }

            foreach (var detail in details.GroupBy(k => new { k.NetworkID, k.NetworkName, k.ServiceUrl, k.ServiceUserName, k.ServicePassword }))
            {
                using (var pmnApi = new Dns.ApiClient.DnsClient(detail.Key.ServiceUrl, detail.Key.ServiceUserName, Lpp.Utilities.Crypto.DecryptString(detail.Key.ServicePassword)))
                {
                    var updateDTOs = detail.Select(k => {
                        var dto = dtos.First(d => d.ResponseID == k.SourceResponseID);
                        return(new Dns.DTO.CNDSUpdateRoutingStatusDTO
                        {
                            NetworkID = k.NetworkID,
                            Network = k.NetworkName,
                            ResponseID = k.ParticipantResponseID,
                            Message = dto.Message,
                            RoutingStatus = (Dns.DTO.Enums.RoutingStatus)dto.RoutingStatus
                        });
                    }).ToArray();

                    var resp = await pmnApi.CNDSRequests.UpdateRoutingStatus(updateDTOs);

                    if (!resp.IsSuccessStatusCode)
                    {
                        return(Request.CreateErrorResponse(resp.StatusCode, await resp.GetMessage()));
                    }
                }
            }
            return(Request.CreateResponse(HttpStatusCode.OK));
        }
Exemple #6
0
        public async Task <IEnumerable <NetworkProjectRequestTypeDataMartDTO> > ListMappingItems()
        {
            //for each registered network, call to the network and get all the applicable Project/RequestType/DataSource combinations

            List <NetworkProjectRequestTypeDataMartDTO> routes = new List <NetworkProjectRequestTypeDataMartDTO>();

            foreach (var network in await DataContext.Networks.AsNoTracking().ToArrayAsync())
            {
                var datasources = await(from ds in DataContext.DataSources.AsNoTracking()
                                        join ne in DataContext.NetworkEntities.AsNoTracking() on ds.ID equals ne.ID
                                        where ds.Deleted == false && ds.Organization.NetworkID == network.ID && ds.Organization.Deleted == false && ne.EntityType == DTO.Enums.EntityType.DataSource
                                        select ne
                                        ).ToDictionaryAsync(ne => ne.NetworkEntityID);

                using (var pmn = new Dns.ApiClient.DnsClient(network.ServiceUrl, network.ServiceUserName, Utilities.Crypto.DecryptString(network.ServicePassword)))
                {
                    try
                    {
                        var rt = await pmn.CNDSRequestTypes.ListAvailableRequestTypes();

                        foreach (var route in rt)
                        {
                            NetworkEntity link;
                            if (datasources.TryGetValue(route.DataMartID, out link))
                            {
                                routes.Add(new NetworkProjectRequestTypeDataMartDTO
                                {
                                    NetworkID     = network.ID,
                                    Network       = network.Name,
                                    ProjectID     = route.ProjectID,
                                    Project       = route.Project,
                                    RequestTypeID = route.RequestTypeID,
                                    RequestType   = route.RequestType,
                                    //Return the CNDS ID for the datasource, not the networks local ID
                                    DataMartID = link.ID,
                                    DataMart   = route.DataMart
                                });
                            }
                        }
                    }catch (Exception ex)
                    {
                        Logger.Error("Error retrieving available requesttypes from Network: " + network.Name + " (" + network.ServiceUrl + ").", ex);
                    }
                }
            }

            return(routes);
        }
Exemple #7
0
        public async Task <HttpResponseMessage> ResubmitSourceRouting(IEnumerable <DTO.Requests.ResubmitRouteDTO> dtos)
        {
            foreach (var dm in dtos)
            {
                var details = await(from route in DataContext.NetworkRequestRoutes
                                    let network = route.Participant.NetworkRequest.Network
                                                  where route.ID == dm.RequestDatamartID
                                                  select new
                {
                    ID = network.ID,
                    network.Name,
                    network.ServiceUrl,
                    network.ServiceUserName,
                    network.ServicePassword,
                    NetworkRouteID = route.ID,
                    route.SourceRequestDataMartID
                }).FirstOrDefaultAsync();

                using (var participantNetworkAPI = new Dns.ApiClient.DnsClient(details.ServiceUrl, details.ServiceUserName, Utilities.Crypto.DecryptString(details.ServicePassword)))
                {
                    var response = new Data.Requests.NetworkRequestResponse {
                        ID = dm.ResponseID, IterationIndex = 1, NetworkRequestRouteID = details.NetworkRouteID, SourceResponseID = DatabaseEx.NewGuid()
                    };
                    DataContext.NetworkRequestResponses.Add(response);
                    var resp = await participantNetworkAPI.CNDSRequests.ResubmitRoute(new Dns.DTO.CNDSResubmitRouteDTO {
                        RequestDatamartID = details.SourceRequestDataMartID, ResponseID = response.SourceResponseID, Message = dm.Message
                    });

                    if (!resp.IsSuccessStatusCode)
                    {
                        return(Request.CreateErrorResponse(resp.StatusCode, resp.ReasonPhrase));
                    }

                    await DataContext.SaveChangesAsync();
                }
            }

            return(Request.CreateResponse(HttpStatusCode.OK));
        }
Exemple #8
0
        public async Task PostParticipantResponseDocuments([FromBody] Guid responseID)
        {
            var details = await(from rsp in DataContext.NetworkRequestResponses
                                let pNetwork = rsp.NetworkRequestRoute.Participant.Network
                                               let sNetwork = rsp.NetworkRequestRoute.Participant.NetworkRequest.Network
                                                              where rsp.ID == responseID
                                                              select new
            {
                ParticipantNetwork = new
                {
                    ID = pNetwork.ID,
                    pNetwork.Name,
                    pNetwork.ServiceUrl,
                    pNetwork.ServiceUserName,
                    pNetwork.ServicePassword
                },
                SourceNetwork = new
                {
                    ID = sNetwork.ID,
                    sNetwork.Name,
                    sNetwork.ServiceUrl,
                    sNetwork.ServiceUserName,
                    sNetwork.ServicePassword
                }
            }).FirstOrDefaultAsync();

            if (details == null)
            {
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Unable to determine the response details."));
            }

            using (var participantNetworkAPI = new Dns.ApiClient.DnsClient(details.ParticipantNetwork.ServiceUrl, details.ParticipantNetwork.ServiceUserName, Utilities.Crypto.DecryptString(details.ParticipantNetwork.ServicePassword)))
            {
                try
                {
                    var participantDocuments = await participantNetworkAPI.Documents.ByResponse(new[] { responseID });

                    var cndsDocuments = participantDocuments.Select(d =>
                    {
                        Guid docID = DatabaseEx.NewGuid();
                        return(new Data.Requests.NetworkRequestDocument
                        {
                            //create the ID of the document for the source network document
                            ID = docID,
                            DestinationRevisionSetID = docID,
                            ResponseID = responseID,
                            //the source document will the the document in the participant network
                            SourceDocumentID = d.ID.Value
                        });
                    }).ToArray();

                    foreach (var cndsDocument in cndsDocuments)
                    {
                        var sourceResponseID = DataContext.NetworkRequestResponses.Where(x => x.ID == responseID).Select(x => x.SourceResponseID).FirstOrDefault();
                        Dns.DTO.ExtendedDocumentDTO participantDocument = participantDocuments.FirstOrDefault(d => d.ID.Value == cndsDocument.SourceDocumentID);
                        if (participantDocument == null)
                        {
                            throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Participant document information not found."));
                        }
                        using (MultipartFormDataContent docData = new MultipartFormDataContent())
                            using (var web = new System.Net.Http.HttpClient())
                            {
                                var creds = Convert.ToBase64String(Encoding.UTF8.GetBytes(details.SourceNetwork.ServiceUserName + ":" + Utilities.Crypto.DecryptString(details.SourceNetwork.ServicePassword)));
                                web.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", creds);
                                HttpResponseMessage response = new HttpResponseMessage();

                                {
                                    docData.Add(new StringContent(sourceResponseID.ToString("D")), "responseID");
                                    docData.Add(new StringContent(cndsDocument.ID.ToString("D")), "id");
                                    docData.Add(new StringContent(details.ParticipantNetwork.ID.ToString("D")), "uploadedByID");
                                    docData.Add(new StringContent(details.ParticipantNetwork.Name), "uploadedBy");
                                    docData.Add(new StringContent(cndsDocument.DestinationRevisionSetID.ToString("D")), "revisionSetID");
                                    if (participantDocument.ParentDocumentID.HasValue)
                                    {
                                        Guid?parentCNDSDocumentID = await DataContext.NetworkRequestDocuments.Where(d => d.SourceDocumentID == participantDocument.ParentDocumentID.Value).Select(d => d.ID).FirstOrDefaultAsync();

                                        if (parentCNDSDocumentID.HasValue)
                                        {
                                            docData.Add(new StringContent(parentCNDSDocumentID.Value.ToString("D")), "parentDocumentID");
                                        }
                                    }

                                    if (!string.IsNullOrEmpty(participantDocument.Description))
                                    {
                                        docData.Add(new StringContent(participantDocument.Description), "description");
                                    }

                                    docData.Add(new StringContent(participantDocument.Name), "documentName");
                                    if (!string.IsNullOrEmpty(participantDocument.Kind))
                                    {
                                        docData.Add(new StringContent(participantDocument.Kind), "kind");
                                    }

                                    //docData.Headers.ContentDisposition.FileName = participantDocument.FileName;


                                    var sourceReadResponse = await participantNetworkAPI.Documents.Download(participantDocument.ID.Value);

                                    var sourceResponse = await sourceReadResponse.Content.ReadAsStreamAsync();

                                    docData.Add(new StreamContent(sourceResponse), "files");

                                    docData.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                                    {
                                        FileName = participantDocument.FileName,
                                        Size     = participantDocument.Length
                                    };

                                    response = await web.PostAsync(details.SourceNetwork.ServiceUrl + "/Documents/UploadResponseOutput", docData);
                                }
                            }
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error(ex.Message, ex);
                    throw;
                }
            }
        }
Exemple #9
0
        public async Task <HttpResponseMessage> Submit(DTO.Requests.SubmitRequestDTO dto)
        {
            //register the request with CNDS
            var request = DataContext.NetworkRequests.Add(new Data.Requests.NetworkRequest
            {
                ID        = dto.SourceRequestID,
                NetworkID = dto.SourceNetworkID
            });

            await DataContext.SaveChangesAsync();

            var routeDefinitionIDs = dto.Routes.Select(rt => rt.NetworkRouteDefinitionID).ToArray();
            var routeDefinitions   = await DataContext.NetworkRequestTypeDefinitions.Where(rt => routeDefinitionIDs.Contains(rt.ID)).ToArrayAsync();

            var networkIDs     = (new[] { dto.SourceNetworkID }).Union(routeDefinitions.Select(rt => rt.NetworkID).Distinct());
            var networkDetails = (await DataContext.Networks.Where(n => networkIDs.Contains(n.ID)).Select(n => new { n.ID, n.Name, n.ServiceUrl, n.ServiceUserName, n.ServicePassword }).ToArrayAsync()).ToDictionary(n => n.ID);

            var datasourceIDs      = routeDefinitions.Select(rt => rt.DataSourceID).Distinct();
            var dataSourceEntities = (await DataContext.NetworkEntities.Where(ne => datasourceIDs.Contains(ne.ID)).ToArrayAsync()).ToDictionary(ne => ne.ID);


            //TODO: make this an asynchronous parallel loop for the registering
            foreach (var participatingRoute in routeDefinitions.GroupBy(k => new { k.NetworkID, k.ProjectID, k.RequestTypeID }))
            {
                var participant = new Data.Requests.NetworkRequestParticipant
                {
                    NetworkRequestID = request.ID,
                    NetworkID        = participatingRoute.Key.NetworkID,
                    ProjectID        = participatingRoute.Key.ProjectID,
                    RequestTypeID    = participatingRoute.Key.RequestTypeID
                };

                request.Participants.Add(participant);

                var requestDocuments = dto.Documents.Select(d => {
                    Guid docID = DatabaseEx.NewGuid();
                    return(new
                    {
                        SourceDocumentID = d.DocumentID,
                        SourceRequestDataMartID = d.SourceRequestDataSourceID,
                        DTO = new Dns.DTO.CNDSRegisterDocumentDTO
                        {
                            SourceDocumentID = d.DocumentID,
                            SourceRevisionSetID = d.RevisionSetID,
                            DocumentID = docID,
                            RevisionSetID = docID,
                            Name = d.Name,
                            FileName = d.FileName,
                            Kind = d.Kind,
                            MimeType = d.MimeType,
                            Length = d.Length,
                            IsViewable = d.IsViewable,
                            Description = d.Description
                        }
                    });
                }).ToArray();

                var network = networkDetails[participatingRoute.Key.NetworkID];
                using (var pmnAPI = new Dns.ApiClient.DnsClient(network.ServiceUrl, network.ServiceUserName, Lpp.Utilities.Crypto.DecryptString(network.ServicePassword)))
                {
                    var requestDto = new Dns.DTO.CNDSRegisterRequestDTO
                    {
                        ParticipantID     = participant.ID,
                        ProjectID         = participatingRoute.Key.ProjectID,
                        RequestTypeID     = participatingRoute.Key.RequestTypeID,
                        SourceNetworkID   = request.NetworkID,
                        SourceNetworkName = networkDetails[request.NetworkID].Name,
                        RequestDetails    = dto.SerializedSourceRequest,
                        Documents         = requestDocuments.Select(d => d.DTO).ToArray()
                    };

                    HashSet <Dns.DTO.CNDSRegisterRouteDTO> routeDTOs = new HashSet <Dns.DTO.CNDSRegisterRouteDTO>();
                    foreach (var rt in participatingRoute)
                    {
                        var rtDTO = dto.Routes.First(x => x.NetworkRouteDefinitionID == rt.ID);

                        var route = new Data.Requests.NetworkRequestRoute
                        {
                            DataSourceID            = rt.DataSourceID,
                            ParticipantID           = participant.ID,
                            SourceRequestDataMartID = rtDTO.SourceRequestDataMartID
                        };

                        var response = new Data.Requests.NetworkRequestResponse {
                            IterationIndex = 1, NetworkRequestRouteID = route.ID, SourceResponseID = rtDTO.SourceResponseID
                        };

                        var responseDocuments = new HashSet <Data.Requests.NetworkRequestDocument>();
                        foreach (var requestDocument in requestDocuments.Where(rd => rtDTO.RequestDocumentIDs.Contains(rd.SourceDocumentID) && rd.SourceRequestDataMartID == route.SourceRequestDataMartID))
                        {
                            responseDocuments.Add(new Data.Requests.NetworkRequestDocument {
                                //the ID of the request document in CNDS will be the ID of the document in the destination network
                                ID = requestDocument.DTO.DocumentID,
                                DestinationRevisionSetID = requestDocument.DTO.RevisionSetID,
                                ResponseID       = response.ID,
                                SourceDocumentID = requestDocument.SourceDocumentID
                            });
                        }
                        response.Documents = responseDocuments;

                        route.Responses.Add(response);
                        participant.Routes.Add(route);

                        routeDTOs.Add(new Dns.DTO.CNDSRegisterRouteDTO
                        {
                            RouteID = route.ID,
                            //Specify the destination networks DataMart ID, not the CNDS DataSource ID
                            DataMartID = dataSourceEntities[rt.DataSourceID].NetworkEntityID,
                            DueDate    = rtDTO.DueDate,
                            Priority   = (Dns.DTO.Enums.Priorities)rtDTO.Priority,
                            ResponseID = response.ID,
                            //The ID will be the ID of the document in the destination network
                            DocumentIDs = response.Documents.Select(d => d.ID).ToArray()
                        });
                    }

                    requestDto.Routes = routeDTOs;

                    try
                    {
                        await DataContext.SaveChangesAsync();
                    }
                    catch (Exception ex)
                    {
                        Logger.Error(ex.Message, ex);
                        return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex));
                    }

                    //has to be saved prior to registering in the participating network to allow for the documents to exist when the participant tries to get the document content.
                    var resp = await pmnAPI.CNDSRequests.Register(requestDto);

                    if (!resp.IsSuccessStatusCode)
                    {
                        return(Request.CreateErrorResponse(resp.StatusCode, resp.ReasonPhrase));
                    }
                }
            }
            return(Request.CreateResponse(HttpStatusCode.OK));
        }