| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- from __future__ import annotations
- from pathlib import Path
- from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile
- from fastapi.responses import HTMLResponse
- from fastapi.templating import Jinja2Templates
- from bom_assistant.api.store import SessionStore, get_store
- from bom_assistant.scouting.ingest import build_session
- from bom_assistant.scouting.orchestrator import scout_row
- router = APIRouter()
- templates = Jinja2Templates(directory=str(Path(__file__).parent / "templates"))
- @router.get("/", response_class=HTMLResponse)
- def index(request: Request) -> HTMLResponse:
- return templates.TemplateResponse(request, "index.html", {})
- @router.post("/upload", response_class=HTMLResponse)
- def upload(
- request: Request,
- file: UploadFile = File(...),
- store: SessionStore = Depends(get_store),
- ) -> HTMLResponse:
- content = file.file.read()
- try:
- session = build_session(content, file.filename or "upload")
- except Exception as exc:
- raise HTTPException(status_code=400, detail=f"failed to parse BOM: {exc}") from exc
- store.create(session)
- return templates.TemplateResponse(request, "_rows.html", {"session": session})
- @router.get("/session/{session_id}/row/{row_id}/scout", response_class=HTMLResponse)
- def scout(
- request: Request,
- session_id: str,
- row_id: str,
- store: SessionStore = Depends(get_store),
- ) -> HTMLResponse:
- session = store.get(session_id)
- row = scout_row(session, row_id)
- store.save(session)
- return templates.TemplateResponse(request, "_scout_result.html", {"row": row})
|