68 lines
2.6 KiB
Python
68 lines
2.6 KiB
Python
import asyncio
|
|
import logging
|
|
from database import SessionLocal
|
|
from models import VitalReading, TransmissionLog
|
|
from schemas import NormalizedVitals
|
|
from api_client import forward_vitals_to_api
|
|
from config import settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
async def retry_failed_transmissions():
|
|
"""
|
|
Background task that periodically checks for untransmitted vital readings
|
|
and attempts to forward them to the API.
|
|
"""
|
|
logger.info("Starting background task for retrying failed transmissions...")
|
|
|
|
while True:
|
|
try:
|
|
db = SessionLocal()
|
|
try:
|
|
# Get readings that haven't been transmitted
|
|
failed_readings = db.query(VitalReading).filter(VitalReading.transmitted == False).limit(50).all()
|
|
|
|
for reading in failed_readings:
|
|
vitals = NormalizedVitals(
|
|
device_id=reading.device_id,
|
|
patient_id=reading.patient_id,
|
|
timestamp=reading.timestamp,
|
|
heart_rate=reading.heart_rate,
|
|
spo2=reading.spo2,
|
|
systolic_bp=reading.systolic_bp,
|
|
diastolic_bp=reading.diastolic_bp,
|
|
map_bp=reading.map_bp,
|
|
respiratory_rate=reading.respiratory_rate,
|
|
temperature=reading.temperature
|
|
)
|
|
|
|
success = await forward_vitals_to_api(vitals)
|
|
|
|
if success:
|
|
reading.transmitted = True
|
|
log_entry = TransmissionLog(
|
|
reading_id=reading.id,
|
|
status="success",
|
|
response_code=200
|
|
)
|
|
db.add(log_entry)
|
|
logger.info(f"Successfully re-transmitted reading {reading.id}")
|
|
else:
|
|
# Log the failure but don't mark as transmitted
|
|
log_entry = TransmissionLog(
|
|
reading_id=reading.id,
|
|
status="failed",
|
|
error_message="Retry failed"
|
|
)
|
|
db.add(log_entry)
|
|
|
|
if failed_readings:
|
|
db.commit()
|
|
finally:
|
|
db.close()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in retry background task: {e}")
|
|
|
|
await asyncio.sleep(settings.retry_interval_seconds)
|