doc-maker / doc_maker.py
pvanand's picture
Update doc_maker.py
4bb4b7e verified
from fastapi import APIRouter, HTTPException
from fastapi.responses import FileResponse
from pydantic import BaseModel
from typing import Dict, Optional
import json
import os
from datetime import datetime
import uuid
import tempfile
router = APIRouter() # Add prefix here
BASE_URL = "https://pvanand-doc-maker.hf.space/api/v1"
DOCS_DIR = os.path.join(tempfile.gettempdir(), "doc_maker_documents")
class DocumentPart(BaseModel):
pageNo: int
content: str
docId: Optional[str] = None
class DocumentResponse(BaseModel):
docId: str
message: str
totalPages: int
download_url: Optional[str] = None
def get_download_url(file_id: str) -> str:
return f"{BASE_URL}/download/{file_id}"
def get_document_path(doc_id: str) -> str:
os.makedirs(DOCS_DIR, exist_ok=True)
return os.path.join(DOCS_DIR, f"{doc_id}.json")
def update_document(doc_id: str, page_no: int, content: str) -> Dict:
filepath = get_document_path(doc_id)
if os.path.exists(filepath):
with open(filepath, 'r', encoding='utf-8') as f:
doc = json.load(f)
doc['updatedAt'] = datetime.utcnow().isoformat()
else:
doc = {
'docId': doc_id,
'createdAt': datetime.utcnow().isoformat(),
'updatedAt': datetime.utcnow().isoformat(),
'content': {}
}
doc['content'][str(page_no)] = content
with open(filepath, 'w', encoding='utf-8') as f:
json.dump(doc, f, ensure_ascii=False, indent=2)
return doc
@router.post("/document/update", response_model=DocumentResponse)
async def add_document_part(part: DocumentPart):
doc_id = part.docId or str(uuid.uuid4())
try:
doc = update_document(doc_id, part.pageNo, part.content)
return DocumentResponse(
docId=doc_id,
message=f"Page {part.pageNo} added successfully",
totalPages=len(doc['content']),
download_url=get_download_url(doc_id)
)
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Error updating document: {str(e)}"
)
@router.get("/document/{doc_id}")
async def get_document(doc_id: str):
filepath = get_document_path(doc_id)
if not os.path.exists(filepath):
raise HTTPException(status_code=404, detail="Document not found")
with open(filepath, 'r', encoding='utf-8') as f:
return json.load(f)
@router.get("/download/{doc_id}")
async def download_document(doc_id: str):
filepath = get_document_path(doc_id)
if not os.path.exists(filepath):
raise HTTPException(status_code=404, detail="Document not found")
return FileResponse(
filepath,
media_type='application/json',
filename=f"document_{doc_id}.json"
)
@router.delete("/document/{doc_id}")
async def delete_document(doc_id: str):
filepath = get_document_path(doc_id)
if not os.path.exists(filepath):
raise HTTPException(status_code=404, detail="Document not found")
os.remove(filepath)
return {"message": "Document deleted successfully"}