routes.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from __future__ import annotations
  2. from pathlib import Path
  3. from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile
  4. from fastapi.responses import HTMLResponse
  5. from fastapi.templating import Jinja2Templates
  6. from bom_assistant.api.store import SessionStore, get_store
  7. from bom_assistant.scouting.ingest import build_session
  8. from bom_assistant.scouting.orchestrator import scout_row
  9. router = APIRouter()
  10. templates = Jinja2Templates(directory=str(Path(__file__).parent / "templates"))
  11. @router.get("/", response_class=HTMLResponse)
  12. def index(request: Request) -> HTMLResponse:
  13. return templates.TemplateResponse(request, "index.html", {})
  14. @router.post("/upload", response_class=HTMLResponse)
  15. def upload(
  16. request: Request,
  17. file: UploadFile = File(...),
  18. store: SessionStore = Depends(get_store),
  19. ) -> HTMLResponse:
  20. content = file.file.read()
  21. try:
  22. session = build_session(content, file.filename or "upload")
  23. except Exception as exc:
  24. raise HTTPException(status_code=400, detail=f"failed to parse BOM: {exc}") from exc
  25. store.create(session)
  26. return templates.TemplateResponse(request, "_rows.html", {"session": session})
  27. @router.get("/session/{session_id}/row/{row_id}/scout", response_class=HTMLResponse)
  28. def scout(
  29. request: Request,
  30. session_id: str,
  31. row_id: str,
  32. store: SessionStore = Depends(get_store),
  33. ) -> HTMLResponse:
  34. session = store.get(session_id)
  35. row = scout_row(session, row_id)
  36. store.save(session)
  37. return templates.TemplateResponse(request, "_scout_result.html", {"row": row})