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)