add button to clear stale 'active' calls
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
from datetime import datetime, timezone, timedelta
|
||||
from fastapi import APIRouter, BackgroundTasks, HTTPException, Query, Depends
|
||||
from pydantic import BaseModel
|
||||
from typing import Optional
|
||||
@@ -59,6 +60,47 @@ async def reprocess_call(call_id: str, background_tasks: BackgroundTasks):
|
||||
return {"ok": True, "call_id": call_id}
|
||||
|
||||
|
||||
@router.post("/close-stale")
|
||||
async def close_stale_calls(
|
||||
older_than_minutes: int = Query(30, ge=1, le=1440, description="Close active calls started more than this many minutes ago."),
|
||||
dry_run: bool = Query(False, description="If true, return what would be closed without writing."),
|
||||
_: dict = Depends(require_admin_token),
|
||||
):
|
||||
"""
|
||||
Find and close calls stuck in 'active' status — e.g. because a node rebooted
|
||||
before sending an end-call event. Returns the list of affected call IDs.
|
||||
"""
|
||||
cutoff = datetime.now(timezone.utc) - timedelta(minutes=older_than_minutes)
|
||||
active_calls = await fstore.collection_list("calls", status="active")
|
||||
|
||||
stale = []
|
||||
for call in active_calls:
|
||||
started_raw = call.get("started_at")
|
||||
if not started_raw:
|
||||
continue
|
||||
try:
|
||||
started = datetime.fromisoformat(started_raw.replace("Z", "+00:00"))
|
||||
except Exception:
|
||||
continue
|
||||
if started < cutoff:
|
||||
stale.append(call)
|
||||
|
||||
if not dry_run:
|
||||
now_iso = datetime.now(timezone.utc).isoformat()
|
||||
for call in stale:
|
||||
await fstore.doc_set("calls", call["call_id"], {
|
||||
"status": "ended",
|
||||
"ended_at": now_iso,
|
||||
})
|
||||
|
||||
return {
|
||||
"dry_run": dry_run,
|
||||
"older_than_minutes": older_than_minutes,
|
||||
"count": len(stale),
|
||||
"call_ids": [c["call_id"] for c in stale],
|
||||
}
|
||||
|
||||
|
||||
@router.patch("/{call_id}/transcript")
|
||||
async def patch_transcript(
|
||||
call_id: str,
|
||||
|
||||
Reference in New Issue
Block a user