diff --git a/Controllers/HL7Controller.cs b/Controllers/HL7Controller.cs new file mode 100644 index 0000000..99c1941 --- /dev/null +++ b/Controllers/HL7Controller.cs @@ -0,0 +1,97 @@ +using Microsoft.AspNetCore.Mvc; +using SimpleLIS.DTO; +using SimpleLIS.Services; +using SimpleLIS.Models; +using AutoMapper; +using System.Text.Json; + +namespace SimpleLIS.Controllers; + +[ApiController] +[Route("api/hl7")] +public class HL7Controller : ControllerBase +{ + private readonly MessageService _messageService; + private readonly PatientService _patientService; + private readonly IMapper _mapper; + + public HL7Controller( + MessageService messageService, + PatientService patientService, + IMapper mapper) + { + _messageService = messageService; + _patientService = patientService; + _mapper = mapper; + } + +[HttpPost("process")] +public async Task ProcessHL7Message([FromBody] JsonElement payload) +{ + try + { + // Create Patient + var patient = new Patient + { + HL7PatientId = payload.GetProperty("hl7PatientId").GetString(), + LastName = payload.GetProperty("lastName").GetString(), + FirstName = payload.GetProperty("firstName").GetString(), + DateOfBirth = payload.GetProperty("dateOfBirth").GetDateTime(), + Gender = payload.GetProperty("gender").GetString(), + Messages = new List() + }; + + // Check for existing patient + var existingPatient = await _patientService.GetPatientByNameAndDOB( + patient.FirstName!, + patient.LastName!, + patient.DateOfBirth + ); + + patient = existingPatient ?? await _patientService.CreatePatientAsync(patient); + + // Create Message + var message = new Message + { + ControlId = payload.GetProperty("controlId").GetString(), + MessageType = payload.GetProperty("messageType").GetString(), + SendingApp = payload.GetProperty("sendingApp").GetString(), + SendingFacility = payload.GetProperty("sendingFacility").GetString(), + ReceivingApp = payload.GetProperty("receivingApp").GetString(), + ReceivingFacility = payload.GetProperty("receivingFacility").GetString(), + Timestamp = payload.GetProperty("timestamp").GetDateTime(), + Version = payload.GetProperty("version").GetString(), + PatientId = patient.PatientId, + Patient = patient, + Observations = new List() + }; + + // Create Observations + var observationsArray = payload.GetProperty("observations"); + foreach (var obsElement in observationsArray.EnumerateArray()) + { + var observation = new Observation + { + ObservationCode = obsElement.GetProperty("ObservationCode").GetString(), + ObservationValue = obsElement.GetProperty("ObservationValue").GetString(), + Units = obsElement.GetProperty("Units").GetString(), + AbnormalFlag = obsElement.GetProperty("AbnormalFlag").GetString(), + ResultStatus = obsElement.GetProperty("ResultStatus").GetString() ?? "F", + Message = message + }; + message.Observations.Add(observation); + } + + var createdMessage = await _messageService.CreateMessageAsync(message); + + return Ok(new { + message = _mapper.Map(createdMessage), + patient = _mapper.Map(patient) + }); + } + catch (Exception ex) + { + return BadRequest(new { error = ex.Message + (ex.InnerException?.Message ?? "") }); + } +} +} diff --git a/Services/PatientService.cs b/Services/PatientService.cs index 3b0e23a..23df81b 100644 --- a/Services/PatientService.cs +++ b/Services/PatientService.cs @@ -52,4 +52,14 @@ public class PatientService { return await _context.Patients.AnyAsync(p => p.PatientId == id); } + public async Task GetPatientByNameAndDOB(string firstName, string lastName, DateTime dateOfBirth) + { + return await _context.Patients + .FirstOrDefaultAsync(p => + p.FirstName == firstName && + p.LastName == lastName && + p.DateOfBirth == dateOfBirth); + } + + } diff --git a/hl7.db-shm b/hl7.db-shm new file mode 100644 index 0000000..597eee2 Binary files /dev/null and b/hl7.db-shm differ diff --git a/hl7.db-wal b/hl7.db-wal new file mode 100644 index 0000000..dbd2e34 Binary files /dev/null and b/hl7.db-wal differ