182 lines
5.3 KiB
Python
182 lines
5.3 KiB
Python
from pathlib import Path
|
|
|
|
from fastapi import APIRouter, Depends, File, Form, Request, UploadFile
|
|
from fastapi.responses import HTMLResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.config import INBOX_ROOT
|
|
from app.db.deps import get_db
|
|
from app.logic.ingest import ingest_directory, ingest_file, ingest_inbox, ingest_uploaded_file
|
|
|
|
router = APIRouter(prefix="/ingest", tags=["ingest"])
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))
|
|
|
|
|
|
@router.get("/", response_class=HTMLResponse)
|
|
def ingest_home(request: Request):
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="ingest/index.html",
|
|
context={
|
|
"request": request,
|
|
"inbox_root": INBOX_ROOT,
|
|
"active_page": "ingest",
|
|
},
|
|
)
|
|
|
|
|
|
@router.post("/upload-files", response_class=HTMLResponse)
|
|
async def ingest_upload_files(
|
|
request: Request,
|
|
uploaded_files: list[UploadFile] = File(...),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
documents = []
|
|
errors = []
|
|
|
|
for uploaded_file in uploaded_files:
|
|
try:
|
|
file_bytes = await uploaded_file.read()
|
|
document = ingest_uploaded_file(
|
|
db=db,
|
|
filename=uploaded_file.filename or "upload.pdf",
|
|
file_bytes=file_bytes,
|
|
source_system="upload_ingest",
|
|
)
|
|
documents.append(document)
|
|
except Exception as e:
|
|
errors.append(f"{uploaded_file.filename}: {e}")
|
|
|
|
if errors and not documents:
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="ingest/result.html",
|
|
context={
|
|
"request": request,
|
|
"message": "Upload failed.",
|
|
"documents": [],
|
|
"errors": errors,
|
|
},
|
|
status_code=400,
|
|
)
|
|
|
|
message = f"Ingested {len(documents)} uploaded file(s)."
|
|
if errors:
|
|
message += f" {len(errors)} file(s) had errors."
|
|
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="ingest/result.html",
|
|
context={
|
|
"request": request,
|
|
"message": message,
|
|
"documents": documents,
|
|
"errors": errors,
|
|
},
|
|
)
|
|
|
|
|
|
@router.post("/server-file", response_class=HTMLResponse)
|
|
def ingest_server_file(
|
|
request: Request,
|
|
file_path: str = Form(...),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
try:
|
|
document = ingest_file(
|
|
db=db,
|
|
file_path=file_path,
|
|
source_system="server_file_ingest",
|
|
)
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="ingest/result.html",
|
|
context={
|
|
"request": request,
|
|
"message": f"Ingested server file successfully: {document.document_id}",
|
|
"documents": [document],
|
|
"errors": [],
|
|
},
|
|
)
|
|
except Exception as e:
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="ingest/result.html",
|
|
context={
|
|
"request": request,
|
|
"message": f"Error ingesting server file: {e}",
|
|
"documents": [],
|
|
"errors": [],
|
|
},
|
|
status_code=400,
|
|
)
|
|
|
|
|
|
@router.post("/server-directory", response_class=HTMLResponse)
|
|
def ingest_server_directory(
|
|
request: Request,
|
|
directory_path: str = Form(...),
|
|
recursive: str | None = Form(None),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
try:
|
|
docs = ingest_directory(
|
|
db=db,
|
|
directory_path=directory_path,
|
|
recursive=recursive is not None,
|
|
source_system="server_directory_ingest",
|
|
)
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="ingest/result.html",
|
|
context={
|
|
"request": request,
|
|
"message": f"Ingested {len(docs)} file(s) from server directory.",
|
|
"documents": docs,
|
|
"errors": [],
|
|
},
|
|
)
|
|
except Exception as e:
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="ingest/result.html",
|
|
context={
|
|
"request": request,
|
|
"message": f"Error ingesting server directory: {e}",
|
|
"documents": [],
|
|
"errors": [],
|
|
},
|
|
status_code=400,
|
|
)
|
|
|
|
|
|
@router.post("/inbox", response_class=HTMLResponse)
|
|
def ingest_inbox_route(request: Request, db: Session = Depends(get_db)):
|
|
try:
|
|
docs = ingest_inbox(db=db)
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="ingest/result.html",
|
|
context={
|
|
"request": request,
|
|
"message": f"Ingested {len(docs)} file(s) from inbox.",
|
|
"documents": docs,
|
|
"errors": [],
|
|
},
|
|
)
|
|
except Exception as e:
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="ingest/result.html",
|
|
context={
|
|
"request": request,
|
|
"message": f"Error ingesting inbox: {e}",
|
|
"documents": [],
|
|
"errors": [],
|
|
},
|
|
status_code=400,
|
|
)
|