Ejemplo n.º 1
0
 public IActionResult GetCases([FromQuery] ListCasesRequest request)
 {
     try
     {
         return(Ok(_caseRecordsUseCase.GetResidentCases(request)));
     }
     catch (DocumentNotFoundException e)
     {
         return(NotFound(e.Message));
     }
 }
        public void ListCasesReturns200WhenSuccessful()
        {
            var careCaseDataList = _fixture.Create <CareCaseDataList>();
            var listCasesRequest = new ListCasesRequest();

            _mockProcessDataUseCase.Setup(x => x.GetResidentCases(listCasesRequest)).Returns(careCaseDataList);
            var response = _caseController.GetCases(listCasesRequest) as OkObjectResult;

            response?.StatusCode.Should().Be(200);
            response?.Value.Should().BeEquivalentTo(careCaseDataList);
        }
Ejemplo n.º 3
0
        public void SetUp()
        {
            _mockHistoricalSocialCareGateway = new Mock <IHistoricalDataGateway>();
            _processDataGateway = new ProcessDataGateway(MongoDbTestContext, _mockHistoricalSocialCareGateway.Object);

            _listCasesRequest = TestHelpers.CreateListCasesRequest(mosaicId: _mosaicId);
            _mockHistoricalSocialCareGateway.Setup(x => x.GetVisitByPersonId(It.IsAny <long>())).Returns(new List <Visit>());
            _mockHistoricalSocialCareGateway.Setup(x => x.GetCaseNotesByPersonId(It.IsAny <long>())).Returns(new List <CaseNote>());

            _fixture = new Fixture();
        }
        public static FilterDefinition <CaseSubmission> GenerateFilterDefinition(ListCasesRequest request, bool addDeletedRecordsFilter = true)
        {
            var builder = Builders <CaseSubmission> .Filter;
            var filter  = builder.Empty;

            if (request.MosaicId != null)
            {
                var bsonQuery = "{'Residents._id':" + request.MosaicId + "}";

                filter &= MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(bsonQuery);
            }
            if (request.WorkerEmail != null)
            {
                var bsonQuery = "{'CreatedBy.Email':" + "\"" + request.WorkerEmail + "\"" + "}";

                filter &= MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(bsonQuery);
            }

            if (request.FormName == "Case Note")
            {
                filter &= Builders <CaseSubmission> .Filter.Eq(x =>
                                                               x.FormId, "adult-case-note") | Builders <CaseSubmission> .Filter.Eq(x =>
                                                                                                                                   x.FormId, "child-case-note");
            }

            if (request.FirstName != null)
            {
                var bsonQuery = "{'Residents.FirstName':" + "/^" + request.FirstName.ToLower() + "$/i}";

                filter &= MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(bsonQuery);
            }

            if (request.LastName != null)
            {
                var bsonQuery = "{'Residents.LastName':" + "/^" + request.LastName.ToLower() + "$/i}";

                filter &= MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(bsonQuery);
            }

            filter &= Builders <CaseSubmission> .Filter.Eq(x =>
                                                           x.SubmissionState, SubmissionState.Submitted);

            if (addDeletedRecordsFilter)
            {
                if (!request.IncludeDeletedRecords)
                {
                    filter &= Builders <CaseSubmission> .Filter.Ne(x => x.Deleted, true);
                }
            }

            return(filter);
        }
        public CareCaseDataList GetResidentCases(ListCasesRequest request)
        {
            string?ncId = null;

            //grab both mosaic id and nc reference id
            if (!string.IsNullOrWhiteSpace(request.MosaicId))
            {
                string ncIdTmp = _databaseGateway.GetNCReferenceByPersonId(request.MosaicId);

                if (!string.IsNullOrEmpty(ncIdTmp))
                {
                    ncId = ncIdTmp;
                }

                string mosaicIdTmp = _databaseGateway.GetPersonIdByNCReference(request.MosaicId);

                if (!string.IsNullOrEmpty(mosaicIdTmp))
                {
                    ncId             = request.MosaicId;
                    request.MosaicId = mosaicIdTmp;
                }
            }

            var(response, totalCount) = _processDataGateway.GetProcessData(request, ncId);
            var  allCareCaseData     = response.ToList();
            long?deletedRecordsCount = null;

            if (request.MosaicId != null || request.WorkerEmail != null || request.FormName != null || request.FirstName != null || request.LastName != null)
            {
                var filter = GenerateFilterDefinition(request);

                if (request.IncludeDeletedRecordsCount)
                {
                    var deletedRecordsFilter = GenerateFilterDefinition(request, addDeletedRecordsFilter: false);

                    deletedRecordsFilter &= Builders <CaseSubmission> .Filter.Eq(x => x.Deleted, true);

                    deletedRecordsCount = _mongoGateway.GetRecordsCountByFilter(MongoConnectionStrings.Map[Collection.ResidentCaseSubmissions], deletedRecordsFilter);
                }

                var caseSubmissions = _mongoGateway
                                      .LoadRecordsByFilter(MongoConnectionStrings.Map[Collection.ResidentCaseSubmissions], filter, null)
                                      .Item1
                                      .Select(x => x.ToCareCaseData(request))
                                      .ToList();

                allCareCaseData.AddRange(caseSubmissions);
                totalCount += caseSubmissions.Count;
            }
            var careCaseData = SortData(request.SortBy ?? "", request.OrderBy ?? "desc", allCareCaseData)
                               .Skip(request.Cursor)
                               .Take(request.Limit)
                               .ToList();

            int?nextCursor = request.Cursor + request.Limit;

            //support page size 1
            if (nextCursor == totalCount || careCaseData.Count < request.Limit)
            {
                nextCursor = null;
            }

            return(new CareCaseDataList
            {
                Cases = careCaseData.ToList(),
                NextCursor = nextCursor,
                DeletedRecordsCount = deletedRecordsCount
            });
        }
        public static CareCaseData ToCareCaseData(this CaseSubmission caseSubmission, ListCasesRequest listCasesRequest)
        {
            var resident = listCasesRequest.MosaicId != null?caseSubmission.Residents
                           .First(x => x.Id == long.Parse(listCasesRequest.MosaicId)) : caseSubmission.Residents[0];

            return(new CareCaseData
            {
                RecordId = caseSubmission.SubmissionId.ToString(),
                PersonId = resident.Id,
                FirstName = resident.FirstName,
                LastName = resident.LastName,
                OfficerEmail = caseSubmission.Workers[0].Email,
                CaseFormTimestamp = caseSubmission.SubmittedAt?.ToString("yyyy-MM-dd") ?? DateTime.Now.ToString("yyyy-MM-dd"),
                FormName = caseSubmission.FormId,
                DateOfBirth = resident.DateOfBirth?.ToString("dd/MM/yyyy"),
                DateOfEvent = caseSubmission.DateOfEvent?.ToString("O") ?? caseSubmission.CreatedAt.ToString("O"),
                CaseFormUrl = caseSubmission.SubmissionId.ToString(),
                FormType = "flexible-form",
                Title = caseSubmission.Title,
                Deleted = (bool)(caseSubmission.Deleted == null ? false : caseSubmission.Deleted),
                DeletionDetails = listCasesRequest.IncludeDeletedRecords ? caseSubmission.DeletionDetails : null
            });
        }
        public Tuple <IEnumerable <CareCaseData>, int> GetProcessData(ListCasesRequest request, string?ncId)
        {
            var result = new List <BsonDocument>();
            FilterDefinition <BsonDocument>?firstNameFilter;
            FilterDefinition <BsonDocument>?lastNameFilter;

            if (!string.IsNullOrWhiteSpace(request.MosaicId))
            {
                var historicRecords = GetHistoricRecordsByPersonId(request.MosaicId, ncId).ToList();
                if (historicRecords.Count > 0)
                {
                    result.AddRange(historicRecords);
                }
            }
            else
            {
                if (!request.ExactNameMatch)
                {
                    firstNameFilter = !string.IsNullOrWhiteSpace(request.FirstName) ?
                                      Builders <BsonDocument> .Filter.Regex("first_name", BsonRegularExpression.Create(new Regex(request.FirstName, RegexOptions.IgnoreCase))) : null;

                    lastNameFilter = !string.IsNullOrWhiteSpace(request.LastName) ?
                                     Builders <BsonDocument> .Filter.Regex("last_name", BsonRegularExpression.Create(new Regex(request.LastName, RegexOptions.IgnoreCase))) : null;
                }
                else
                {
                    firstNameFilter = !string.IsNullOrWhiteSpace(request.FirstName) ?
                                      Builders <BsonDocument> .Filter.Regex("first_name", new BsonRegularExpression("^" + request.FirstName + "$", "i")) : null;

                    lastNameFilter = !string.IsNullOrWhiteSpace(request.LastName) ?
                                     Builders <BsonDocument> .Filter.Regex("last_name", new BsonRegularExpression("^" + request.LastName + "$", "i")) : null;
                }
                var workerEmailFilter = !string.IsNullOrWhiteSpace(request.WorkerEmail) ?
                                        Builders <BsonDocument> .Filter.Regex("worker_email", BsonRegularExpression.Create(new Regex(request.WorkerEmail, RegexOptions.IgnoreCase))) : null;

                var caseNoteTypeFilter = !string.IsNullOrWhiteSpace(request.FormName) ?
                                         Builders <BsonDocument> .Filter.Regex("form_name", BsonRegularExpression.Create(new Regex(request.FormName, RegexOptions.IgnoreCase))) : null;

                var query = _sccvDbContext.getCollection().AsQueryable();

                if (firstNameFilter != null)
                {
                    query = query.Where(db => firstNameFilter.Inject());
                }
                if (lastNameFilter != null)
                {
                    query = query.Where(db => lastNameFilter.Inject());
                }
                if (workerEmailFilter != null)
                {
                    query = query.Where(db => workerEmailFilter.Inject());
                }
                if (caseNoteTypeFilter != null)
                {
                    query = query.Where(db => caseNoteTypeFilter.Inject());
                }
                result = query.ToList();
            }
            //if document does not exist in the DB, then thrown a corresponding error.
            if (result == null)
            {
                throw new DocumentNotFoundException("document not found");
            }

            var response = result.ToResponse();

            if (request.StartDate != null)
            {
                if (DateTime.TryParseExact(((DateTime)request.StartDate).ToString(CultureInfo.InvariantCulture), "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var startDate))
                {
                    response = response
                               .Where(x =>
                    {
                        if (DateTime.TryParseExact(x.CaseFormTimestamp, "dd/MM/yyyy H:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
                        {
                            return(date.Date >= startDate.Date);
                        }
                        return(false);
                    })
                               .ToList();
                }
            }

            if (request.EndDate != null)
            {
                if (DateTime.TryParseExact(((DateTime)request.EndDate).ToString(CultureInfo.InvariantCulture), "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var endDate))
                {
                    response = response
                               .Where(x =>
                    {
                        if (DateTime.TryParseExact(x.CaseFormTimestamp, "dd/MM/yyyy H:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
                        {
                            return(date.Date <= endDate.Date);
                        }
                        return(false);
                    })
                               .ToList();
                }
            }

            var totalCount = response.Count;

            return(new Tuple <IEnumerable <CareCaseData>, int>(response, totalCount));
        }