/// <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="auditLogResourceParameters">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 CreateLinksForAuditLogs( LinkedResourceBaseDto wrapper, AuditLogResourceParameters auditLogResourceParameters, bool hasNext, bool hasPrevious) { wrapper.Links.Add( new LinkDto( _linkGeneratorService.CreateAuditLogsResourceUri(ResourceUriType.Current, auditLogResourceParameters), "self", "GET")); if (hasNext) { wrapper.Links.Add( new LinkDto( _linkGeneratorService.CreateAuditLogsResourceUri(ResourceUriType.NextPage, auditLogResourceParameters), "nextPage", "GET")); } if (hasPrevious) { wrapper.Links.Add( new LinkDto( _linkGeneratorService.CreateAuditLogsResourceUri(ResourceUriType.PreviousPage, auditLogResourceParameters), "previousPage", "GET")); } return(wrapper); }
/// <summary> /// Get auditLogs from repository and auto map to Dto /// </summary> /// <typeparam name="T">Identifier or detail Dto</typeparam> /// <param name="auditLogResourceParameters">Standard parameters for representing resource</param> /// <returns></returns> private ICollection <T> GetAuditLogsForExtract <T>(AuditLogResourceParameters auditLogResourceParameters) where T : class { var orderby = Extensions.GetOrderBy <AuditLog>(auditLogResourceParameters.OrderBy, "asc"); // FIlter audit logs var predicate = PredicateBuilder.New <AuditLog>(true); predicate = predicate.And(au => au.ActionDate >= auditLogResourceParameters.SearchFrom && au.ActionDate <= auditLogResourceParameters.SearchTo); switch (auditLogResourceParameters.AuditType) { case AuditTypeFilter.SubscriberAccess: predicate = predicate.And(au => au.AuditType == AuditType.InvalidSubscriberAccess || au.AuditType == AuditType.ValidSubscriberAccess); break; case AuditTypeFilter.SubscriberPost: predicate = predicate.And(au => au.AuditType == AuditType.InValidSubscriberPost || au.AuditType == AuditType.ValidSubscriberPost); break; case AuditTypeFilter.MeddraImport: predicate = predicate.And(au => au.AuditType == AuditType.InValidMedDRAImport || au.AuditType == AuditType.ValidMedDRAImport); break; case AuditTypeFilter.UserLogin: predicate = predicate.And(au => au.AuditType == AuditType.UserLogin); break; case AuditTypeFilter.SynchronisationSuccessful: predicate = predicate.And(au => au.AuditType == AuditType.SynchronisationForm); break; case AuditTypeFilter.SynchronisationError: predicate = predicate.And(au => au.AuditType == AuditType.SynchronisationError); break; } if (auditLogResourceParameters.FacilityId > 0) { predicate = predicate.And(au => au.User.Facilities.Any(uf => uf.Facility.Id == auditLogResourceParameters.FacilityId)); } var auditLogsFromRepo = _auditLogRepository.List(predicate, orderby, ""); if (auditLogsFromRepo != null) { // Map EF entity to Dto var mappedAuditLogs = _mapper.Map <ICollection <T> >(auditLogsFromRepo); return(mappedAuditLogs); } return(null); }
public string CreateAuditLogsResourceUri(ResourceUriType type, AuditLogResourceParameters auditLogResourceParameters) { switch (type) { case ResourceUriType.PreviousPage: return(_linkGenerator.GetPathByName(_accessor.HttpContext, "GetAuditLogsByIdentifier", new { orderBy = auditLogResourceParameters.OrderBy, auditType = auditLogResourceParameters.AuditType, searchFrom = auditLogResourceParameters.SearchFrom, searchTo = auditLogResourceParameters.SearchTo, facilityId = auditLogResourceParameters.FacilityId, pageNumber = auditLogResourceParameters.PageNumber - 1, pageSize = auditLogResourceParameters.PageSize })); case ResourceUriType.NextPage: return(_linkGenerator.GetPathByName(_accessor.HttpContext, "GetAuditLogsByIdentifier", new { orderBy = auditLogResourceParameters.OrderBy, auditType = auditLogResourceParameters.AuditType, searchFrom = auditLogResourceParameters.SearchFrom, searchTo = auditLogResourceParameters.SearchTo, facilityId = auditLogResourceParameters.FacilityId, pageNumber = auditLogResourceParameters.PageNumber + 1, pageSize = auditLogResourceParameters.PageSize })); case ResourceUriType.Current: default: return(_linkGenerator.GetPathByName(_accessor.HttpContext, "GetAuditLogsByIdentifier", new { orderBy = auditLogResourceParameters.OrderBy, auditType = auditLogResourceParameters.AuditType, searchFrom = auditLogResourceParameters.SearchFrom, searchTo = auditLogResourceParameters.SearchTo, facilityId = auditLogResourceParameters.FacilityId, pageNumber = auditLogResourceParameters.PageNumber, pageSize = auditLogResourceParameters.PageSize })); } }
public ActionResult <LinkedCollectionResourceWrapperDto <AuditLogDetailDto> > GetAuditLogsByDetail( [FromQuery] AuditLogResourceParameters auditLogResourceParameters) { if (!_typeHelperService.TypeHasProperties <AuditLogDetailDto> (auditLogResourceParameters.OrderBy)) { return(BadRequest()); } var mappedAuditLogsWithLinks = GetAuditLogs <AuditLogDetailDto>(auditLogResourceParameters); var wrapper = new LinkedCollectionResourceWrapperDto <AuditLogDetailDto>(mappedAuditLogsWithLinks.TotalCount, mappedAuditLogsWithLinks); var wrapperWithLinks = CreateLinksForAuditLogs(wrapper, auditLogResourceParameters, mappedAuditLogsWithLinks.HasNext, mappedAuditLogsWithLinks.HasPrevious); return(Ok(wrapperWithLinks)); }
/// <summary> /// Get patients from auditLogs /// </summary> /// <param name="auditLogResourceParameters">Standard parameters for representing resource</param> /// <returns></returns> private List <long> GetPatientsFromAuditLogs(AuditLogResourceParameters auditLogResourceParameters) { var orderby = Extensions.GetOrderBy <AuditLog>(auditLogResourceParameters.OrderBy, "asc"); // FIlter audit logs var predicate = PredicateBuilder.New <AuditLog>(true); predicate = predicate.And(au => au.ActionDate >= auditLogResourceParameters.SearchFrom && au.ActionDate <= auditLogResourceParameters.SearchTo); predicate = predicate.And(au => au.AuditType == AuditType.SynchronisationForm); if (auditLogResourceParameters.FacilityId > 0) { predicate = predicate.And(au => au.User.Facilities.Any(uf => uf.Facility.Id == auditLogResourceParameters.FacilityId)); } var auditLogsFromRepo = _auditLogRepository.List(predicate, orderby, ""); if (auditLogsFromRepo != null) { var returnIds = new List <long>(); foreach (var auditLog in auditLogsFromRepo) { // Extract form identifier var formIdentifier = auditLog.Details.Replace("Form submission successful ", ""); // Locate patient if (!string.IsNullOrWhiteSpace(formIdentifier)) { var attachments = _attachmentRepository.List(a => a.Patient != null && a.Description == formIdentifier); if (attachments.Count > 0) { var patient = attachments.First()?.Patient; if (patient != null) { returnIds.Add(patient.Id); } } } } return(returnIds); } return(null); }
public async Task <ActionResult> DownloadPatientDataset( [FromQuery] AuditLogResourceParameters auditLogResourceParameters) { var userName = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value; var userFromRepo = await _userRepository.GetAsync(u => u.UserName == userName); if (!userFromRepo.AllowDatasetDownload) { ModelState.AddModelError("Message", "You do not have permissions to download a dataset"); return(BadRequest(ModelState)); } if (auditLogResourceParameters.AuditType != AuditTypeFilter.SynchronisationSuccessful) { ModelState.AddModelError("Message", "Invalid audit type for dataset download"); return(BadRequest(ModelState)); } var patientIds = GetPatientsFromAuditLogs(auditLogResourceParameters); var model = _excelDocumentService.CreateActiveDatasetForDownload(patientIds.ToArray(), 0); return(PhysicalFile(model.FullPath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); }
/// <summary> /// Get auditLogs from repository and auto map to Dto /// </summary> /// <typeparam name="T">Identifier or detail Dto</typeparam> /// <param name="auditLogResourceParameters">Standard parameters for representing resource</param> /// <returns></returns> private PagedCollection <T> GetAuditLogs <T>(AuditLogResourceParameters auditLogResourceParameters) where T : class { var pagingInfo = new PagingInfo() { PageNumber = auditLogResourceParameters.PageNumber, PageSize = auditLogResourceParameters.PageSize }; var orderby = Extensions.GetOrderBy <AuditLog>(auditLogResourceParameters.OrderBy, "asc"); // FIlter audit logs var predicate = PredicateBuilder.New <AuditLog>(true); predicate = predicate.And(au => au.ActionDate >= auditLogResourceParameters.SearchFrom && au.ActionDate <= auditLogResourceParameters.SearchTo); switch (auditLogResourceParameters.AuditType) { case AuditTypeFilter.SubscriberAccess: predicate = predicate.And(au => au.AuditType == AuditType.InvalidSubscriberAccess || au.AuditType == AuditType.ValidSubscriberAccess); break; case AuditTypeFilter.SubscriberPost: predicate = predicate.And(au => au.AuditType == AuditType.InValidSubscriberPost || au.AuditType == AuditType.ValidSubscriberPost); break; case AuditTypeFilter.MeddraImport: predicate = predicate.And(au => au.AuditType == AuditType.InValidMedDRAImport || au.AuditType == AuditType.ValidMedDRAImport); break; case AuditTypeFilter.UserLogin: predicate = predicate.And(au => au.AuditType == AuditType.UserLogin); break; case AuditTypeFilter.SynchronisationSuccessful: predicate = predicate.And(au => au.AuditType == AuditType.SynchronisationForm); break; case AuditTypeFilter.SynchronisationError: predicate = predicate.And(au => au.AuditType == AuditType.SynchronisationError); break; case AuditTypeFilter.DataValidation: predicate = predicate.And(au => au.AuditType == AuditType.DataValidation); break; } if (auditLogResourceParameters.FacilityId > 0) { predicate = predicate.And(au => au.User.Facilities.Any(uf => uf.Facility.Id == auditLogResourceParameters.FacilityId)); } var pagedAuditLogsFromRepo = _auditLogRepository.List(pagingInfo, predicate, orderby, new string[] { "User" }); if (pagedAuditLogsFromRepo != null) { // Map EF entity to Dto var mappedAuditLogs = PagedCollection <T> .Create(_mapper.Map <PagedCollection <T> >(pagedAuditLogsFromRepo), pagingInfo.PageNumber, pagingInfo.PageSize, pagedAuditLogsFromRepo.TotalCount); // Prepare pagination data for response var paginationMetadata = new { totalCount = mappedAuditLogs.TotalCount, pageSize = mappedAuditLogs.PageSize, currentPage = mappedAuditLogs.CurrentPage, totalPages = mappedAuditLogs.TotalPages, }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); // Add HATEOAS links to each individual resource mappedAuditLogs.ForEach(dto => CreateLinksForAuditLog(dto)); return(mappedAuditLogs); } return(null); }