Skip to content

Commit cc98929

Browse files
LNK-4303: add event date (#1239)
* LNK-4303: fix admitted patients endpoint * add EventDate field to PatientEvent * update PatientEventQueries for new field to simplify querying * update integration tests * update migration to set EventDate to payload value for existing records. * Update PatientEventFactory.cs
1 parent 39b5bdf commit cc98929

10 files changed

Lines changed: 1786 additions & 804 deletions

File tree

DotNet/Census/Application/Factories/PatientEventFactory.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using LantanaGroup.Link.Census.Application.Interfaces;
22
using LantanaGroup.Link.Census.Application.Models.Enums;
3+
using LantanaGroup.Link.Census.Application.Models.Payloads.Fhir.List;
34
using LantanaGroup.Link.Census.Domain.Entities.POI;
45

56
namespace LantanaGroup.Link.Census.Application.Factories;
@@ -18,7 +19,18 @@ public static PatientEvent Create(string correlationId, string patientId, string
1819
Payload = payload,
1920
SourceType = sourceType,
2021
CreateDate = DateTime.Now,
21-
FacilityId = facilityId
22+
FacilityId = facilityId,
23+
EventDate = GetEventDate(payload)
24+
};
25+
}
26+
27+
private static DateTime GetEventDate(IPayload payload)
28+
{
29+
return payload switch
30+
{
31+
FHIRListDischargePayload dischargePayload => dischargePayload.DischargeDate,
32+
FHIRListAdmitPayload admitPayload => admitPayload.AdmitDate,
33+
_ => throw new Exception("Unsupported payload type for event date extraction")
2234
};
2335
}
2436
}

DotNet/Census/Domain/Context/CensusContext.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
4141
.WithOne(x => x.PatientEncounter)
4242
.HasForeignKey(x => x.PatientEncounterId).IsRequired();
4343

44+
modelBuilder.Entity<PatientEncounter>()
45+
.HasMany(x => x.PatientIdentifiers)
46+
.WithOne(x => x.PatientEncounter)
47+
.HasForeignKey(x => x.PatientEncounterId).IsRequired();
48+
4449
// Configure the PayloadJsonConverter
4550
var payloadConverter = new PayloadJsonConverter();
4651

@@ -70,6 +75,10 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
7075
.HasIndex(e => e.CreateDate)
7176
.HasDatabaseName("IX_PatientEvents_CreateDate");
7277

78+
modelBuilder.Entity<PatientEvent>()
79+
.HasIndex(e => e.EventDate)
80+
.HasDatabaseName("IX_PatientEvents_EventDate");
81+
7382
// Add composite indexes for better query performance
7483
modelBuilder.Entity<PatientEvent>()
7584
.HasIndex(e => new { e.CorrelationId, e.CreateDate })

DotNet/Census/Domain/Entities/POI/PatientEvent.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ public class PatientEvent : BaseEntityExtended
2525
public IPayload Payload { get; set; }
2626
[Column(TypeName = "nvarchar(255)")]
2727
public SourceType SourceType { get; set; }
28+
public DateTime EventDate { get; set; }
2829
}

DotNet/Census/Domain/Managers/PatientEventManager.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using LantanaGroup.Link.Census.Domain.Entities.POI;
2-
using LantanaGroup.Link.Shared.Application.Services;
32
using LantanaGroup.Link.Shared.Domain.Repositories.Interfaces;
43

54
namespace LantanaGroup.Link.Census.Domain.Managers;

DotNet/Census/Domain/Queries/PatientEncounterQueries.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
// Updated PatientEncounterQueries.cs (interface and implementation)
2-
using LantanaGroup.Link.Census.Application.Models;
1+
using LantanaGroup.Link.Census.Application.Models;
32
using LantanaGroup.Link.Census.Application.Models.Enums;
43
using LantanaGroup.Link.Census.Application.Models.Payloads.Fhir.List;
54
using LantanaGroup.Link.Census.Domain.Context;
@@ -8,8 +7,6 @@
87
using LantanaGroup.Link.Shared.Application.Models.Responses;
98
using Microsoft.EntityFrameworkCore;
109
using System.Collections.Concurrent;
11-
using System.Linq.Expressions;
12-
using System.Reflection;
1310

1411
namespace LantanaGroup.Link.Census.Domain.Queries;
1512

@@ -233,7 +230,7 @@ public async Task RebuildPatientEncounterTable(CancellationToken cancellationTok
233230
var allEvents = await _context.PatientEvents
234231
.Where(e => e.CorrelationId != null && e.CorrelationId != "")
235232
.OrderBy(e => e.CorrelationId)
236-
.ThenBy(e => e.ModifyDate)
233+
.ThenBy(e => e.EventDate)
237234
.ToListAsync(cancellationToken);
238235

239236
_logger.LogInformation("Retrieved {count} events in {time}ms",
@@ -279,7 +276,7 @@ await Parallel.ForEachAsync(eventsByCorrelation, options, async (correlationGrou
279276
}
280277

281278
encounter.MedicalRecordNumber = evt.MedicalRecordNumber;
282-
encounter.AdmitDate = evt.CreateDate;
279+
encounter.AdmitDate = evt.EventDate;
283280
encounter.ModifyDate = evt.ModifyDate;
284281
encounter.EncounterType = evt.EventType.ToString();
285282

DotNet/Census/Domain/Queries/PatientEventQueries.cs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public async Task<IEnumerable<PatientEventModel>> GetAdmittedPatientEventModelsB
117117
{
118118
// Find the latest event for this patient
119119
var latestEvent = events
120-
.OrderByDescending(e => e.CreateDate)
120+
.OrderByDescending(e => e.EventDate)
121121
.FirstOrDefault();
122122

123123
// If the latest event is an admit event, include this patient
@@ -180,7 +180,7 @@ public async Task<PatientEvent> GetLatestEventByFacilityAndPatientId(string faci
180180

181181
return await _context.PatientEvents
182182
.Where(x => x.FacilityId == facilityId && x.SourcePatientId == patientId)
183-
.OrderByDescending(x => x.CreateDate)
183+
.OrderByDescending(x => x.EventDate)
184184
.FirstOrDefaultAsync(cancellationToken);
185185
}
186186

@@ -296,12 +296,12 @@ private IQueryable<PatientEvent> GetPatientQuery(string facilityId, string? corr
296296

297297
if (startDate.HasValue && startDate != default)
298298
{
299-
baseQuery = baseQuery.Where(x => x.CreateDate >= startDate.Value);
299+
baseQuery = baseQuery.Where(x => x.EventDate >= startDate.Value);
300300
}
301301

302302
if (endDate.HasValue && endDate != default)
303303
{
304-
baseQuery = baseQuery.Where(x => x.CreateDate <= endDate.Value);
304+
baseQuery = baseQuery.Where(x => x.EventDate <= endDate.Value);
305305
}
306306

307307
// Create specific queries for FHIR events with date filtering
@@ -317,14 +317,12 @@ private IQueryable<PatientEvent> GetPatientQuery(string facilityId, string? corr
317317

318318
if (startDate.HasValue && startDate != default)
319319
{
320-
admitQuery = admitQuery.Where(x =>
321-
((FHIRListAdmitPayload)x.Payload).AdmitDate >= startDate.Value);
320+
admitQuery = admitQuery.Where(x => x.EventDate >= startDate.Value);
322321
}
323322

324323
if (endDate.HasValue && endDate != default)
325324
{
326-
admitQuery = admitQuery.Where(x =>
327-
((FHIRListAdmitPayload)x.Payload).AdmitDate <= endDate.Value);
325+
admitQuery = admitQuery.Where(x => x.EventDate <= endDate.Value);
328326
}
329327

330328
queries.Add(admitQuery);
@@ -334,14 +332,12 @@ private IQueryable<PatientEvent> GetPatientQuery(string facilityId, string? corr
334332

335333
if (startDate.HasValue && startDate != default)
336334
{
337-
dischargeQuery = dischargeQuery.Where(x =>
338-
((FHIRListDischargePayload)x.Payload).DischargeDate >= startDate.Value);
335+
dischargeQuery = dischargeQuery.Where(x => x.EventDate >= startDate.Value);
339336
}
340337

341338
if (endDate.HasValue && endDate != default)
342339
{
343-
dischargeQuery = dischargeQuery.Where(x =>
344-
((FHIRListDischargePayload)x.Payload).DischargeDate <= endDate.Value);
340+
dischargeQuery = dischargeQuery.Where(x => x.EventDate <= endDate.Value);
345341
}
346342

347343
queries.Add(dischargeQuery);

0 commit comments

Comments
 (0)