feat: add /api/register-patient endpoint to seed demographics for binary-only monitors
This commit is contained in:
@@ -349,6 +349,80 @@ def _calculate_age(dob_str: str) -> Optional[int]:
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
@router.post("/register-patient")
|
||||
def register_patient(
|
||||
mrn: str,
|
||||
gender: str,
|
||||
dob: str,
|
||||
name: str = "Unknown",
|
||||
bed_id: str = None,
|
||||
device_id: str = None,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
Register or update patient demographics in the monitor database.
|
||||
|
||||
Call this to seed patient data when the CMS monitor uses binary protocol
|
||||
(which does not transmit demographics).
|
||||
|
||||
Example:
|
||||
POST /api/register-patient?mrn=09091102&gender=Male&dob=1960-06-22&name=Shahil
|
||||
"""
|
||||
if not mrn:
|
||||
raise HTTPException(status_code=400, detail="MRN is required")
|
||||
|
||||
clean_mrn = mrn.strip().upper()
|
||||
|
||||
# Check if patient already exists
|
||||
patient = db.query(Patient).filter(
|
||||
(Patient.mrn == clean_mrn) | (Patient.patient_id == clean_mrn)
|
||||
).first()
|
||||
|
||||
if patient:
|
||||
# Update existing record
|
||||
patient.mrn = clean_mrn
|
||||
patient.name = name or patient.name
|
||||
patient.gender = gender or patient.gender
|
||||
patient.dob = dob or patient.dob
|
||||
if bed_id:
|
||||
patient.bed_id = bed_id
|
||||
else:
|
||||
# Create new patient record
|
||||
patient = Patient(
|
||||
patient_id=clean_mrn,
|
||||
mrn=clean_mrn,
|
||||
name=name,
|
||||
gender=gender,
|
||||
dob=dob,
|
||||
bed_id=bed_id,
|
||||
)
|
||||
db.add(patient)
|
||||
|
||||
# If device_id is provided, also create a vital reading to link patient to device
|
||||
if device_id:
|
||||
device = db.query(Device).filter(Device.device_id == device_id).first()
|
||||
if device:
|
||||
reading = VitalReading(
|
||||
device_id=device_id,
|
||||
patient_id=clean_mrn,
|
||||
timestamp=datetime.now(timezone.utc),
|
||||
transmitted=True,
|
||||
)
|
||||
db.add(reading)
|
||||
|
||||
db.commit()
|
||||
db.refresh(patient)
|
||||
|
||||
return {
|
||||
"status": "ok",
|
||||
"patient_id": patient.patient_id,
|
||||
"mrn": patient.mrn,
|
||||
"name": patient.name,
|
||||
"gender": patient.gender,
|
||||
"dob": patient.dob,
|
||||
"bed_id": patient.bed_id,
|
||||
}
|
||||
|
||||
@router.get("/match-patient")
|
||||
def match_patient(
|
||||
mrn: str = None,
|
||||
|
||||
Reference in New Issue
Block a user