64 lines
2.5 KiB
Python
64 lines
2.5 KiB
Python
|
|
import httpx
|
||
|
|
import logging
|
||
|
|
from typing import Optional
|
||
|
|
from schemas import NormalizedVitals
|
||
|
|
from config import settings
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
async def forward_vitals_to_api(vitals: NormalizedVitals) -> bool:
|
||
|
|
"""
|
||
|
|
Attempts to POST the normalized vitals to the configured target API
|
||
|
|
and to the Render cloud database.
|
||
|
|
Returns True if at least one forward succeeds.
|
||
|
|
"""
|
||
|
|
import os
|
||
|
|
headers = {"Content-Type": "application/json"}
|
||
|
|
|
||
|
|
# 1. Forward to primary target API (e.g. Injomo Dev Workflow)
|
||
|
|
primary_url = settings.target_api_url
|
||
|
|
primary_success = False
|
||
|
|
if primary_url:
|
||
|
|
try:
|
||
|
|
primary_headers = headers.copy()
|
||
|
|
if settings.api_token:
|
||
|
|
primary_headers["Authorization"] = f"Bearer {settings.api_token}"
|
||
|
|
async with httpx.AsyncClient(timeout=10.0) as client:
|
||
|
|
response = await client.post(
|
||
|
|
primary_url,
|
||
|
|
json=vitals.model_dump(mode="json"),
|
||
|
|
headers=primary_headers
|
||
|
|
)
|
||
|
|
response.raise_for_status()
|
||
|
|
logger.info(f"Successfully forwarded vitals to primary API for device {vitals.device_id}")
|
||
|
|
primary_success = True
|
||
|
|
except Exception as e:
|
||
|
|
logger.error(f"Error forwarding to primary API: {e}")
|
||
|
|
|
||
|
|
# 2. Forward to Render Cloud Server
|
||
|
|
render_url = "https://contectfiveparamonitor.onrender.com/api/push-vitals"
|
||
|
|
render_success = False
|
||
|
|
|
||
|
|
# Detect if we are already running on Render to prevent an infinite loop
|
||
|
|
is_on_render = os.getenv("RENDER") is not None or os.getenv("PORT") == "10000" or "render.local" in os.getenv("HOSTNAME", "")
|
||
|
|
|
||
|
|
if not is_on_render:
|
||
|
|
try:
|
||
|
|
url_with_key = render_url
|
||
|
|
if settings.api_token:
|
||
|
|
url_with_key = f"{render_url}?api_key={settings.api_token}"
|
||
|
|
|
||
|
|
async with httpx.AsyncClient(timeout=10.0) as client:
|
||
|
|
response = await client.post(
|
||
|
|
url_with_key,
|
||
|
|
json=vitals.model_dump(mode="json"),
|
||
|
|
headers=headers
|
||
|
|
)
|
||
|
|
response.raise_for_status()
|
||
|
|
logger.info(f"Successfully forwarded vitals to Render Cloud for device {vitals.device_id}")
|
||
|
|
render_success = True
|
||
|
|
except Exception as e:
|
||
|
|
logger.error(f"Error forwarding to Render Cloud: {e}")
|
||
|
|
|
||
|
|
return primary_success or render_success
|