/// <summary> /// Prepare HATEOAS links for a identifier based collection resource /// </summary> /// <param name="wrapper">The linked dto wrapper that will host each link</param> /// <param name="workFlowGuid">The unique identifier of the work flow that we are generating analysis for</param> /// <param name="termId">The unique id of the meddra term</param> /// <param name="analyserTermSetResourceParameters">Standard parameters for representing resource</param> /// <param name="hasNext">Are there additional pages</param> /// <param name="hasPrevious">Are there previous pages</param> /// <returns></returns> private LinkedResourceBaseDto CreateLinksForAnalyserPatients( LinkedResourceBaseDto wrapper, Guid workFlowGuid, int termId, AnalyserTermSetResourceParameters analyserTermSetResourceParameters, bool hasNext, bool hasPrevious) { wrapper.Links.Add( new LinkDto( _linkGeneratorService.CreateAnalyserTermPatientsResourceUri(workFlowGuid, termId, ResourceUriType.Current, analyserTermSetResourceParameters), "self", "GET")); if (hasNext) { wrapper.Links.Add( new LinkDto( _linkGeneratorService.CreateAnalyserTermPatientsResourceUri(workFlowGuid, termId, ResourceUriType.NextPage, analyserTermSetResourceParameters), "nextPage", "GET")); } if (hasPrevious) { wrapper.Links.Add( new LinkDto( _linkGeneratorService.CreateAnalyserTermPatientsResourceUri(workFlowGuid, termId, ResourceUriType.PreviousPage, analyserTermSetResourceParameters), "previousPage", "GET")); } return(wrapper); }
public string CreateAnalyserTermPatientsResourceUri(Guid workFlowGuid, int termId, ResourceUriType type, AnalyserTermSetResourceParameters analyserTermSetResourceParameters) { switch (type) { case ResourceUriType.PreviousPage: return(_linkGenerator.GetPathByName(_accessor.HttpContext, "GetAnalyserTermPatients", new { workFlowGuid, id = termId, conditionId = analyserTermSetResourceParameters.ConditionId, cohortGroupId = analyserTermSetResourceParameters.CohortGroupId, searchFrom = analyserTermSetResourceParameters.SearchFrom, searchTo = analyserTermSetResourceParameters.SearchTo, riskFactorOptionNames = analyserTermSetResourceParameters.RiskFactorOptionNames, pageNumber = analyserTermSetResourceParameters.PageNumber - 1, pageSize = analyserTermSetResourceParameters.PageSize })); case ResourceUriType.NextPage: return(_linkGenerator.GetPathByName(_accessor.HttpContext, "GetAnalyserTermPatients", new { workFlowGuid, id = termId, conditionId = analyserTermSetResourceParameters.ConditionId, cohortGroupId = analyserTermSetResourceParameters.CohortGroupId, searchFrom = analyserTermSetResourceParameters.SearchFrom, searchTo = analyserTermSetResourceParameters.SearchTo, riskFactorOptionNames = analyserTermSetResourceParameters.RiskFactorOptionNames, pageNumber = analyserTermSetResourceParameters.PageNumber + 1, pageSize = analyserTermSetResourceParameters.PageSize })); case ResourceUriType.Current: default: return(_linkGenerator.GetPathByName(_accessor.HttpContext, "GetAnalyserTermPatients", new { workFlowGuid, id = termId, conditionId = analyserTermSetResourceParameters.ConditionId, cohortGroupId = analyserTermSetResourceParameters.CohortGroupId, searchFrom = analyserTermSetResourceParameters.SearchFrom, searchTo = analyserTermSetResourceParameters.SearchTo, riskFactorOptionNames = analyserTermSetResourceParameters.RiskFactorOptionNames, pageNumber = analyserTermSetResourceParameters.PageNumber, pageSize = analyserTermSetResourceParameters.PageSize })); } }
/// <summary> /// Map additional dto detail elements not handled through automapper /// </summary> /// <param name="dto">The dto that the link has been added to</param> /// <param name="analyserTermSetResourceParameters">Standard parameters for representing resource</param> /// <returns></returns> private AnalyserTermDetailDto CustomResultMap(AnalyserTermDetailDto dto, AnalyserTermSetResourceParameters analyserTermSetResourceParameters) { dto.Results = GetAnalyserResultSets <AnalyserResultDto>(dto.TerminologyMeddraId, analyserTermSetResourceParameters); // Generate series for exposed cases var exposedSeriesValueArray = new List <SeriesValueList>(); var exposedSeriesValueList = new SeriesValueList() { Name = "Exposed Cases" }; var exposedValues = new List <SeriesValueListItem>(); var riskSeriesValueArray = new List <SeriesValueList>(); var riskSeriesValueList = new SeriesValueList() { Name = "Unadjused Relative Risks" }; var riskValues = new List <SeriesValueListItem>(); foreach (var result in dto.Results) { var exposedModelItem = new SeriesValueListItem() { Value = result.ExposedIncidenceRate.Cases, //Min = intValue - ((intValue * 20) / 100), //Max = intValue + ((intValue * 20) / 100), Name = result.Medication }; exposedValues.Add(exposedModelItem); var riskModelItem = new SeriesValueListItem() { Value = result.UnadjustedRelativeRisk, //Min = intValue - ((intValue * 20) / 100), //Max = intValue + ((intValue * 20) / 100), Name = result.Medication }; riskValues.Add(riskModelItem); } exposedSeriesValueList.Series = exposedValues; exposedSeriesValueArray.Add(exposedSeriesValueList); riskSeriesValueList.Series = riskValues; riskSeriesValueArray.Add(riskSeriesValueList); dto.ExposedCaseSeries = exposedSeriesValueArray.ToArray(); dto.RelativeRiskSeries = riskSeriesValueArray.ToArray(); return(dto); }
public ActionResult <LinkedCollectionResourceWrapperDto <AnalyserTermIdentifierDto> > GetAnalyserTermsByIdentifier(Guid workFlowGuid, [FromQuery] AnalyserTermSetResourceParameters analyserTermSetResourceParameters) { if (analyserTermSetResourceParameters == null) { ModelState.AddModelError("Message", "Unable to locate filter parameters payload"); return(BadRequest(ModelState)); } var mappedResults = GetAnalyserTermSets <AnalyserTermIdentifierDto>(analyserTermSetResourceParameters); var wrapper = new LinkedCollectionResourceWrapperDto <AnalyserTermIdentifierDto>(mappedResults.TotalCount, mappedResults); var wrapperWithLinks = CreateLinksForAnalyserTermSets(wrapper, workFlowGuid, analyserTermSetResourceParameters, mappedResults.HasNext, mappedResults.HasPrevious); return(Ok(wrapperWithLinks)); }
/// <summary> /// Get patient results from repository and auto map to Dto /// </summary> /// <typeparam name="T">Identifier, detail or expanded Dto</typeparam> /// <param name="termId">The unique id of the MedDRA term that we are getting results for</param> /// <param name="analyserTermSetResourceParameters">Standard parameters for representing resource</param> /// <returns></returns> private PagedCollection <T> GetAnalyserPatientSets <T>(int termId, AnalyserTermSetResourceParameters analyserTermSetResourceParameters) where T : class { var pagingInfo = new PagingInfo() { PageNumber = analyserTermSetResourceParameters.PageNumber, PageSize = analyserTermSetResourceParameters.PageSize }; // prepare risk factor xml var riskFactorXml = ""; var includeRiskFactor = "False"; XmlDocument xmlDoc = new XmlDocument(); if (analyserTermSetResourceParameters.RiskFactorOptionNames?.Count > 0) { XmlNode rootNode = xmlDoc.CreateElement("Factors", ""); foreach (var display in analyserTermSetResourceParameters.RiskFactorOptionNames) { var riskFactor = _riskFactorRepository.Get(r => r.Options.Any(ro => ro.Display == display)); if (riskFactor != null) { XmlNode factorNode = xmlDoc.CreateElement("Factor", ""); XmlNode factorChildNode = xmlDoc.CreateElement("Name", ""); factorChildNode.InnerText = riskFactor.FactorName; factorNode.AppendChild(factorChildNode); factorChildNode = xmlDoc.CreateElement("Option", ""); factorChildNode.InnerText = riskFactor.Options.Single(ro => ro.Display == display)?.Display; factorNode.AppendChild(factorChildNode); rootNode.AppendChild(factorNode); includeRiskFactor = "True"; } } xmlDoc.AppendChild(rootNode); riskFactorXml = xmlDoc.InnerXml; } List <SqlParameter> parameters = new List <SqlParameter>(); parameters.Add(new SqlParameter("@ConditionId", analyserTermSetResourceParameters.ConditionId.ToString())); parameters.Add(new SqlParameter("@CohortId", analyserTermSetResourceParameters.CohortGroupId.ToString())); parameters.Add(new SqlParameter("@StartDate", analyserTermSetResourceParameters.SearchFrom.ToString())); parameters.Add(new SqlParameter("@FinishDate", analyserTermSetResourceParameters.SearchTo.ToString())); parameters.Add(new SqlParameter("@TermID", termId.ToString())); parameters.Add(new SqlParameter("@IncludeRiskFactor", includeRiskFactor)); parameters.Add(new SqlParameter("@RateByCount", "True")); parameters.Add(new SqlParameter("@DebugPatientList", "True")); parameters.Add(new SqlParameter("@RiskFactorXml", riskFactorXml)); parameters.Add(new SqlParameter("@DebugMode", "False")); var resultsFromService = PagedCollection <ContingencyAnalysisPatient> .Create( _context.ContingencyAnalysisPatients .FromSqlRaw($"Exec spGenerateAnalysis @ConditionId, @CohortId, @StartDate, @FinishDate, @TermID, @IncludeRiskFactor, @RateByCount, @DebugPatientList, @RiskFactorXml, @DebugMode", parameters.ToArray()).ToList(), pagingInfo.PageNumber, pagingInfo.PageSize); if (resultsFromService != null) { // Map results to Dto var mappedResults = PagedCollection <T> .Create(_mapper.Map <PagedCollection <T> >(resultsFromService), pagingInfo.PageNumber, pagingInfo.PageSize, resultsFromService.TotalCount); // Prepare pagination data for response var paginationMetadata = new { totalCount = mappedResults.TotalCount, pageSize = mappedResults.PageSize, currentPage = mappedResults.CurrentPage, totalPages = mappedResults.TotalPages, }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); return(mappedResults); } return(null); }
/// <summary> /// Get results from repository and auto map to Dto /// </summary> /// <typeparam name="T">Identifier, detail or expanded Dto</typeparam> /// <param name="termId">The unique id of the MedDRA term that we are getting results for</param> /// <param name="analyserTermSetResourceParameters">Standard parameters for representing resource</param> /// <returns></returns> private ICollection <T> GetAnalyserResultSets <T>(int termId, AnalyserTermSetResourceParameters analyserTermSetResourceParameters) where T : class { // prepare risk factor xml var riskFactorXml = ""; var includeRiskFactor = "False"; XmlDocument xmlDoc = new XmlDocument(); if (analyserTermSetResourceParameters.RiskFactorOptionNames?.Count > 0) { XmlNode rootNode = xmlDoc.CreateElement("Factors", ""); foreach (var display in analyserTermSetResourceParameters.RiskFactorOptionNames) { var riskFactor = _riskFactorRepository.Get(r => r.Options.Any(ro => ro.Display == display)); if (riskFactor != null) { XmlNode factorNode = xmlDoc.CreateElement("Factor", ""); XmlNode factorChildNode = xmlDoc.CreateElement("Name", ""); factorChildNode.InnerText = riskFactor.FactorName; factorNode.AppendChild(factorChildNode); factorChildNode = xmlDoc.CreateElement("Option", ""); factorChildNode.InnerText = riskFactor.Options.Single(ro => ro.Display == display)?.Display; factorNode.AppendChild(factorChildNode); rootNode.AppendChild(factorNode); includeRiskFactor = "True"; } } xmlDoc.AppendChild(rootNode); riskFactorXml = xmlDoc.InnerXml; } List <SqlParameter> parameters = new List <SqlParameter>(); parameters.Add(new SqlParameter("@ConditionId", analyserTermSetResourceParameters.ConditionId.ToString())); parameters.Add(new SqlParameter("@CohortId", analyserTermSetResourceParameters.CohortGroupId.ToString())); parameters.Add(new SqlParameter("@StartDate", analyserTermSetResourceParameters.SearchFrom.ToString())); parameters.Add(new SqlParameter("@FinishDate", analyserTermSetResourceParameters.SearchTo.ToString())); parameters.Add(new SqlParameter("@TermID", termId.ToString())); parameters.Add(new SqlParameter("@IncludeRiskFactor", includeRiskFactor)); parameters.Add(new SqlParameter("@RateByCount", "True")); parameters.Add(new SqlParameter("@DebugPatientList", "False")); parameters.Add(new SqlParameter("@RiskFactorXml", riskFactorXml)); parameters.Add(new SqlParameter("@DebugMode", "False")); var resultsFromService = _context.ContingencyAnalysisItems .FromSqlRaw($"Exec spGenerateAnalysis @ConditionId, @CohortId, @StartDate, @FinishDate, @TermID, @IncludeRiskFactor, @RateByCount, @DebugPatientList, @RiskFactorXml, @DebugMode", parameters.ToArray()).ToList(); if (resultsFromService != null) { // Map results to Dto return(_mapper.Map <ICollection <T> >(resultsFromService)); } return(null); }
public ActionResult <LinkedCollectionResourceWrapperDto <AnalyserPatientDto> > GetAnalyserTermPatients(Guid workFlowGuid, int id, [FromQuery] AnalyserTermSetResourceParameters analyserTermSetResourceParameters) { var workFlowFromRepo = _workFlowRepository.Get(r => r.WorkFlowGuid == workFlowGuid); if (workFlowFromRepo == null) { return(BadRequest()); } if (analyserTermSetResourceParameters == null) { ModelState.AddModelError("Message", "Unable to locate filter parameters payload"); return(BadRequest(ModelState)); } var mappedResults = GetAnalyserPatientSets <AnalyserPatientDto>(id, analyserTermSetResourceParameters); var wrapper = new LinkedCollectionResourceWrapperDto <AnalyserPatientDto>(mappedResults.TotalCount, mappedResults); var wrapperWithLinks = CreateLinksForAnalyserPatients(wrapper, workFlowGuid, id, analyserTermSetResourceParameters, mappedResults.HasNext, mappedResults.HasPrevious); return(Ok(wrapperWithLinks)); }
public async Task <ActionResult <AnalyserTermDetailDto> > GetAnalyserTermByDetail(Guid workFlowGuid, int id, [FromQuery] AnalyserTermSetResourceParameters analyserTermSetResourceParameters) { var workFlowFromRepo = _workFlowRepository.Get(r => r.WorkFlowGuid == workFlowGuid); if (workFlowFromRepo == null) { return(BadRequest()); } var mappedMeddraTerm = await GetMeddraTermAsync <AnalyserTermDetailDto>(id); if (mappedMeddraTerm == null) { return(NotFound()); } return(Ok(CreateLinksForMeddraTerm <AnalyserTermDetailDto>(CustomResultMap(mappedMeddraTerm, analyserTermSetResourceParameters)))); }