Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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
                }));
            }
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        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"));
        }
Esempio n. 7
0
        /// <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);
        }