feat(backend): add GET /api/batches and GET /api/batches/{id}

This commit is contained in:
Tyler
2026-06-19 19:25:54 -06:00
parent 86e69d5b95
commit 39379d2d5e
2 changed files with 131 additions and 0 deletions
+48
View File
@@ -369,4 +369,52 @@ def _ndjson_stream_835(result: ParseResult835) -> Iterator[bytes]:
yield (json.dumps({"type": "summary", "data": json.loads(result.summary.model_dump_json())}) + "\n").encode("utf-8")
# --------------------------------------------------------------------------- #
# GET endpoints (read views over the in-memory store)
# --------------------------------------------------------------------------- #
def _batch_summary_claim_count(rec: BatchRecord) -> int:
"""Return the number of claims on a batch, handling both 837P and 835."""
if rec.kind == "837p":
return len(rec.result.claims) # type: ignore[attr-defined]
if rec.kind == "835":
return len(rec.result.claims) # type: ignore[attr-defined]
return 0
@app.get("/api/batches")
def list_batches(limit: int = Query(100, ge=1, le=1000)) -> dict[str, Any]:
"""Summary of all parsed batches, newest first."""
records = store.list(limit=limit)
items = [
{
"id": r.id,
"kind": r.kind,
"inputFilename": r.input_filename,
"parsedAt": r.parsed_at.isoformat().replace("+00:00", "Z"),
"claimCount": _batch_summary_claim_count(r),
}
for r in records
]
all_records = store.all()
return {
"items": items,
"total": len(all_records),
"returned": len(items),
"has_more": len(all_records) > len(items),
}
@app.get("/api/batches/{batch_id}")
def get_batch(batch_id: str) -> Any:
rec = store.get(batch_id)
if rec is None:
raise HTTPException(
status_code=404,
detail={"error": "Not found", "detail": f"Batch {batch_id} not found"},
)
return json.loads(rec.result.model_dump_json())
__all__ = ["app"]