| | import os |
| | from pymongo import MongoClient |
| | from datetime import datetime |
| | from bson import ObjectId |
| | from dotenv import load_dotenv |
| |
|
| | class SheamiDB: |
| | def __init__(self, uri: str, db_name: str = "sheami"): |
| | """Initialize connection to MongoDB Atlas (or local Mongo).""" |
| | self.client = MongoClient(uri) |
| | self.db = self.client[db_name] |
| |
|
| | |
| | self.users = self.db["users"] |
| | self.patients = self.db["patients"] |
| | self.reports = self.db["reports"] |
| | self.trends = self.db["trends"] |
| | self.final_reports = self.db["final_reports"] |
| |
|
| | |
| | |
| | |
| | def add_user(self, email: str, name: str) -> str: |
| | user = { |
| | "email": email, |
| | "name": name, |
| | "created_at": datetime.utcnow() |
| | } |
| | result = self.users.insert_one(user) |
| | return str(result.inserted_id) |
| |
|
| | def get_user(self, user_id: str) -> dict: |
| | return self.users.find_one({"_id": ObjectId(user_id)}) |
| |
|
| | |
| | |
| | |
| | def add_patient(self, user_id: str, name: str, dob: str, gender: str) -> str: |
| | patient = { |
| | "user_id": ObjectId(user_id), |
| | "name": name, |
| | "dob": dob, |
| | "gender": gender, |
| | "created_at": datetime.utcnow() |
| | } |
| | result = self.patients.insert_one(patient) |
| | return str(result.inserted_id) |
| |
|
| | def get_patients_by_user(self, user_id: str) -> list: |
| | return list(self.patients.find({"user_id": ObjectId(user_id)})) |
| |
|
| | |
| | |
| | |
| | def add_report(self, patient_id: str, file_name: str, parsed_data: dict) -> str: |
| | report = { |
| | "patient_id": ObjectId(patient_id), |
| | "uploaded_at": datetime.utcnow(), |
| | "file_name": file_name, |
| | "parsed_data": parsed_data |
| | } |
| | result = self.reports.insert_one(report) |
| | return str(result.inserted_id) |
| |
|
| | def get_reports_by_patient(self, patient_id: str) -> list: |
| | return list(self.reports.find({"patient_id": ObjectId(patient_id)})) |
| |
|
| | |
| | |
| | |
| | def add_or_update_trend(self, patient_id: str, test_name: str, trend_data: list): |
| | """Insert new trend or update existing one.""" |
| | self.trends.update_one( |
| | {"patient_id": ObjectId(patient_id), "test_name": test_name}, |
| | {"$set": {"trend_data": trend_data, "last_updated": datetime.utcnow()}}, |
| | upsert=True |
| | ) |
| |
|
| | def get_trends_by_patient(self, patient_id: str) -> list: |
| | return list(self.trends.find({"patient_id": ObjectId(patient_id)})) |
| |
|
| | |
| | |
| | |
| | def add_final_report(self, patient_id: str, summary: str, recommendations: list, trend_snapshots: list) -> str: |
| | final_report = { |
| | "patient_id": ObjectId(patient_id), |
| | "generated_at": datetime.utcnow(), |
| | "summary": summary, |
| | "recommendations": recommendations, |
| | "trend_snapshots": trend_snapshots |
| | } |
| | result = self.final_reports.insert_one(final_report) |
| | return str(result.inserted_id) |
| |
|
| | def get_final_reports_by_patient(self, patient_id: str) -> list: |
| | return list(self.final_reports.find({"patient_id": ObjectId(patient_id)})) |
| |
|
| |
|
| | |
| | |
| | |
| | if __name__ == "__main__": |
| | load_dotenv(override=True) |
| | db = SheamiDB(os.getenv("DB_URI")) |
| |
|
| | |
| | user_id = db.add_user("doctor1@sheami.com", "Dr. Smith") |
| |
|
| | |
| | patient_id = db.add_patient(user_id, "John Doe", "1980-05-20", "male") |
| |
|
| | |
| | parsed_data = { |
| | "tests": [ |
| | {"name": "Hemoglobin", "value": 13.5, "unit": "g/dL", "reference_range": "13.0-17.0"}, |
| | {"name": "Cholesterol", "value": 210, "unit": "mg/dL", "reference_range": "<200"} |
| | ] |
| | } |
| | report_id = db.add_report(patient_id, "bloodwork_july.pdf", parsed_data) |
| |
|
| | |
| | db.add_or_update_trend(patient_id, "Hemoglobin", [ |
| | {"date": "2025-05-01", "value": 13.2}, |
| | {"date": "2025-07-01", "value": 13.5}, |
| | {"date": "2025-08-19", "value": 13.8} |
| | ]) |
| |
|
| | |
| | final_report_id = db.add_final_report( |
| | patient_id, |
| | "Hemoglobin stable, cholesterol slightly high.", |
| | ["Maintain healthy diet", "Check cholesterol in 3 months"], |
| | [ |
| | {"test_name": "Hemoglobin", "latest_value": 13.8, "direction": "stable"}, |
| | {"test_name": "Cholesterol", "latest_value": 210, "direction": "increasing"} |
| | ] |
| | ) |
| |
|
| | print("User ID:", user_id) |
| | print("Patient ID:", patient_id) |
| | print("Report ID:", report_id) |
| | print("Final Report ID:", final_report_id) |
| |
|