import logging from app.tasks import celery_app from app.database import SessionLocal from app.models.pdf_document import PDFDocument from app.services import pdf_service, vector_service logger = logging.getLogger(__name__) @celery_app.task(name="process_pdf") def process_pdf(document_id: int, file_path: str): """Background task: extract PDF text and store in ChromaDB.""" db = SessionLocal() try: doc = db.query(PDFDocument).filter(PDFDocument.id == document_id).first() if not doc: logger.error(f"Document {document_id} not found") return # Get page count total_pages = pdf_service.get_page_count(file_path) doc.total_pages = total_pages db.commit() # Extract text from all pages pages = pdf_service.extract_text_by_page(file_path) if not pages: doc.status = "error" doc.error_message = "No text could be extracted from the PDF" db.commit() return # Store in ChromaDB vector_service.store_pages(document_id, pages) # Mark as ready doc.status = "ready" db.commit() logger.info(f"Document {document_id} processed: {total_pages} pages, {len(pages)} with text") except Exception as e: logger.exception(f"Error processing document {document_id}") try: doc = db.query(PDFDocument).filter(PDFDocument.id == document_id).first() if doc: doc.status = "error" doc.error_message = str(e)[:500] db.commit() except Exception: pass finally: db.close()