59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
import json
|
|
from typing import List, Any
|
|
from fastapi import APIRouter, HTTPException, status
|
|
from pydantic import BaseModel
|
|
|
|
from app.services import engine
|
|
from app.services.store import document_store
|
|
|
|
router = APIRouter(prefix="/documents/{document_id}/edits", tags=["edits"])
|
|
compat_router = APIRouter(tags=["edits"])
|
|
|
|
class EditOperation(BaseModel):
|
|
type: str
|
|
pageIndex: int
|
|
data: Any
|
|
|
|
class EditsRequest(BaseModel):
|
|
operations: List[EditOperation]
|
|
|
|
def apply_edits_impl(document_id: str, request: EditsRequest):
|
|
if not engine.is_available():
|
|
raise HTTPException(
|
|
status_code=status.HTTP_501_NOT_IMPLEMENTED,
|
|
detail="Engine bridge (bindings/python) not yet available."
|
|
)
|
|
|
|
doc_info = document_store.get_document(document_id)
|
|
if not doc_info:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Document not found")
|
|
|
|
try:
|
|
pdfengine = engine.require()
|
|
doc = doc_info["doc_instance"]
|
|
|
|
edits_json = json.dumps(request.model_dump())
|
|
|
|
doc.apply_edits(edits_json)
|
|
|
|
new_bytes = doc.save_incremental()
|
|
|
|
new_doc = pdfengine.PdfDocument.load_from_memory(new_bytes)
|
|
|
|
new_info = document_store.add_document(
|
|
filename=doc_info["filename"],
|
|
bytes_data=new_bytes,
|
|
doc_instance=new_doc
|
|
)
|
|
|
|
return {"success": True, "newDocumentId": new_info["id"]}
|
|
except Exception as e:
|
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
|
|
|
|
@router.post("")
|
|
def apply_edits(document_id: str, request: EditsRequest):
|
|
return apply_edits_impl(document_id, request)
|
|
|
|
@compat_router.post("/edits/{document_id}")
|
|
def apply_edits_compat(document_id: str, request: EditsRequest):
|
|
return apply_edits_impl(document_id, request) |