from datetime import datetime from typing import Optional, List from bson import ObjectId class PDFFile: """PDF file model for MongoDB.""" collection_name = "files" def __init__( self, user_id: str, filename: str, original_filename: str, file_path: str, file_size: int, file_type: str = "application/pdf", created_at: Optional[datetime] = None, _id: Optional[ObjectId] = None ): self._id = _id or ObjectId() self.user_id = user_id self.filename = filename self.original_filename = original_filename self.file_path = file_path self.file_size = file_size self.file_type = file_type self.created_at = created_at or datetime.utcnow() def to_dict(self) -> dict: """Convert file to dictionary for MongoDB insertion.""" return { "_id": self._id, "user_id": self.user_id, "filename": self.filename, "original_filename": self.original_filename, "file_path": self.file_path, "file_size": self.file_size, "file_type": self.file_type, "created_at": self.created_at } @classmethod def from_dict(cls, data: dict) -> "PDFFile": """Create PDFFile instance from MongoDB document.""" return cls( _id=data.get("_id"), user_id=data.get("user_id"), filename=data.get("filename"), original_filename=data.get("original_filename"), file_path=data.get("file_path"), file_size=data.get("file_size"), file_type=data.get("file_type"), created_at=data.get("created_at") ) @property def id(self) -> str: """Get string representation of file ID.""" return str(self._id) class MergedPDF: """Merged PDF file model for MongoDB.""" collection_name = "merged_files" def __init__( self, user_id: str, filename: str, file_path: str, file_size: int, source_file_ids: List[str], created_at: Optional[datetime] = None, _id: Optional[ObjectId] = None ): self._id = _id or ObjectId() self.user_id = user_id self.filename = filename self.file_path = file_path self.file_size = file_size self.source_file_ids = source_file_ids self.created_at = created_at or datetime.utcnow() def to_dict(self) -> dict: """Convert merged file to dictionary for MongoDB insertion.""" return { "_id": self._id, "user_id": self.user_id, "filename": self.filename, "file_path": self.file_path, "file_size": self.file_size, "source_file_ids": self.source_file_ids, "created_at": self.created_at } @classmethod def from_dict(cls, data: dict) -> "MergedPDF": """Create MergedPDF instance from MongoDB document.""" return cls( _id=data.get("_id"), user_id=data.get("user_id"), filename=data.get("filename"), file_path=data.get("file_path"), file_size=data.get("file_size"), source_file_ids=data.get("source_file_ids"), created_at=data.get("created_at") ) @property def id(self) -> str: """Get string representation of merged file ID.""" return str(self._id)