o2o-infinith-backend/app/api/clinics.py

73 lines
2.7 KiB
Python

import logging
import uuid6
from fastapi import APIRouter, Depends, HTTPException, status
from common.deps import verify_api_key
from common.db.hospital import select_hospital, insert_hospital
from common.db.source import insert_source
from common.utils import get_env
from integrations.firecrawl import FirecrawlClient
from models.clinic import ClinicCreate, ClinicCreateResponse, ClinicResponse, ClinicHistoryResponse, RunSummary
router = APIRouter(prefix="/api/clinics", tags=["clinics"], dependencies=[Depends(verify_api_key)])
logger = logging.getLogger(__name__)
_REQUIRED_FIELDS = ["clinicName"]
_COLLECTED_FIELDS = ["clinicName", "clinicNameEn", "address", "phone", "slogan", "services", "doctors"]
@router.post("", status_code=status.HTTP_201_CREATED, response_model=ClinicCreateResponse)
async def create_clinic(body: ClinicCreate):
logger.info("POST /api/clinics url=%s", body.url)
info = await FirecrawlClient(get_env("FIRECRAWL_API_KEY")).fetch_clinic_info(body.url)
missing = [f for f in _COLLECTED_FIELDS if not (info or {}).get(f)]
required_missing = [f for f in _REQUIRED_FIELDS if f in missing]
if required_missing:
raise HTTPException(status_code=404, detail={"missing": missing})
hospital_id = str(uuid6.uuid7())
row = await insert_hospital(
hospital_id,
name=info["clinicName"],
name_en=info.get("clinicNameEn"),
road_address=info.get("address"),
)
await insert_source(hospital_id, "mainpage", body.url)
return ClinicCreateResponse(
id=hospital_id,
url=body.url,
name=info["clinicName"],
created_at=str(row["created_at"]),
)
@router.get("/{hospital_id}", response_model=ClinicResponse)
async def get_clinic(hospital_id: str):
logger.info("GET /api/clinics/%s", hospital_id)
row = await select_hospital(hospital_id)
if not row:
raise HTTPException(status_code=404, detail="Clinic not found")
return ClinicResponse(**{**row, "created_at": str(row["created_at"]), "updated_at": str(row["updated_at"])})
# Not done
@router.get("/{id}/history", response_model=ClinicHistoryResponse)
async def get_clinic_history(id: str):
logger.info("GET /api/clinics/%s/history", id)
return ClinicHistoryResponse(
clinic_id=id,
runs=[
RunSummary(
run_id="22222222-2222-2222-2222-222222222222",
status="complete",
started_at="2026-04-20T09:00:00Z",
completed_at="2026-04-20T09:01:30Z",
overall_score=82,
)
],
metrics_timeseries={
"youtube_subscribers": [{"date": "2026-04-20", "value": 12345}]
},
)