diff --git a/vitallink/backend/__pycache__/database.cpython-39.pyc b/vitallink/backend/__pycache__/database.cpython-39.pyc index e9719f6..51d3263 100644 Binary files a/vitallink/backend/__pycache__/database.cpython-39.pyc and b/vitallink/backend/__pycache__/database.cpython-39.pyc differ diff --git a/vitallink/backend/database.py b/vitallink/backend/database.py index caabe03..2fd8300 100644 --- a/vitallink/backend/database.py +++ b/vitallink/backend/database.py @@ -135,36 +135,47 @@ class VitalLinkDatabase: # PATIENT OPERATIONS # ======================================================================== - async def save_patient(self, patient_data: Dict): - """Save new patient to database""" - await self.conn.execute( - """ - INSERT INTO patients ( - patient_id, band_id, first_name, last_name, dob, - symptoms, severity, check_in_time, current_tier - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) - """, - ( - patient_data["patient_id"], - patient_data["band_id"], - patient_data["first_name"], - patient_data["last_name"], - patient_data["dob"], - json.dumps(patient_data["symptoms"]), - patient_data["severity"], - patient_data["check_in_time"], - patient_data.get("current_tier", "NORMAL"), - ), - ) - await self.conn.commit() - # Log event - await self.log_event( - "patient_checkin", +async def save_patient(self, patient_data: Dict): + """Save new patient to database""" + # Convert datetime to ISO string if needed + check_in_time = patient_data["check_in_time"] + if isinstance(check_in_time, datetime): + check_in_time = check_in_time.isoformat() + + await self.conn.execute( + """ + INSERT INTO patients ( + patient_id, band_id, first_name, last_name, dob, + symptoms, severity, check_in_time, current_tier + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( patient_data["patient_id"], patient_data["band_id"], - patient_data, - ) + patient_data["first_name"], + patient_data["last_name"], + patient_data["dob"], + json.dumps(patient_data["symptoms"]), + patient_data["severity"], + check_in_time, # Now a string + patient_data.get("current_tier", "NORMAL"), + ), + ) + await self.conn.commit() + + # Log event with serializable data + await self.log_event( + "patient_checkin", + patient_data["patient_id"], + patient_data["band_id"], + { + "first_name": patient_data["first_name"], + "last_name": patient_data["last_name"], + "symptoms": patient_data["symptoms"], + "severity": patient_data["severity"], + }, + ) async def update_patient_tier(self, patient_id: str, new_tier: str): """Update patient's current tier""" @@ -315,23 +326,39 @@ class VitalLinkDatabase: # SYSTEM EVENTS (Audit Trail) # ======================================================================== - async def log_event( - self, - event_type: str, - patient_id: Optional[str], - band_id: Optional[str], - details: Dict, - ): - """Log system event for audit trail""" - await self.conn.execute( - """ - INSERT INTO system_events ( - event_time, event_type, patient_id, band_id, details - ) VALUES (?, ?, ?, ?, ?) - """, - (datetime.now(), event_type, patient_id, band_id, json.dumps(details)), - ) - await self.conn.commit() + +async def log_event( + self, + event_type: str, + patient_id: Optional[str], + band_id: Optional[str], + details: Dict, +): + """Log system event for audit trail""" + + # Ensure details is JSON serializable + serializable_details = {} + for key, value in details.items(): + if isinstance(value, datetime): + serializable_details[key] = value.isoformat() + else: + serializable_details[key] = value + + await self.conn.execute( + """ + INSERT INTO system_events ( + event_time, event_type, patient_id, band_id, details + ) VALUES (?, ?, ?, ?, ?) + """, + ( + datetime.now().isoformat(), # Convert to string + event_type, + patient_id, + band_id, + json.dumps(serializable_details), + ), + ) + await self.conn.commit() async def get_events( self, diff --git a/vitallink/frontend/dashboard/src/App.jsx b/vitallink/frontend/dashboard/src/App.jsx index 09f6d72..2d7ae9a 100644 --- a/vitallink/frontend/dashboard/src/App.jsx +++ b/vitallink/frontend/dashboard/src/App.jsx @@ -365,14 +365,176 @@ function App() { )} > ) : ( - /* Wristbands tab - your existing code stays the same */
No wristbands configured
+ )} ++ Format: [ver][seq][timestamp][flags][hr][spo2][temp_x100][activity_x100][checksum][rfu] +
+