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); }
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)); }