Spaces:
Running
Running
| """Document repository — SQLite CRUD for documents table.""" | |
| from __future__ import annotations | |
| from datetime import UTC, datetime | |
| from domain.models import Document | |
| from persistence.database import get_connection | |
| def _row_to_document(row) -> Document: | |
| created = row["created_at"] | |
| if isinstance(created, str): | |
| created = datetime.fromisoformat(created) | |
| if created.tzinfo is None: | |
| created = created.replace(tzinfo=UTC) | |
| return Document( | |
| id=row["id"], | |
| filename=row["filename"], | |
| content_type=row["content_type"], | |
| file_size=row["file_size"], | |
| page_count=row["page_count"], | |
| storage_path=row["storage_path"], | |
| created_at=created, | |
| ) | |
| async def insert(doc: Document) -> None: | |
| """Persist a new document record.""" | |
| async with get_connection() as db: | |
| await db.execute( | |
| """INSERT INTO documents (id, filename, content_type, file_size, page_count, storage_path, created_at) | |
| VALUES (?, ?, ?, ?, ?, ?, ?)""", | |
| ( | |
| doc.id, | |
| doc.filename, | |
| doc.content_type, | |
| doc.file_size, | |
| doc.page_count, | |
| doc.storage_path, | |
| str(doc.created_at), | |
| ), | |
| ) | |
| await db.commit() | |
| async def find_all(*, limit: int = 200, offset: int = 0) -> list[Document]: | |
| """Return documents ordered by creation date (newest first).""" | |
| async with get_connection() as db: | |
| cursor = await db.execute( | |
| "SELECT * FROM documents ORDER BY created_at DESC LIMIT ? OFFSET ?", | |
| (limit, offset), | |
| ) | |
| rows = await cursor.fetchall() | |
| return [_row_to_document(r) for r in rows] | |
| async def find_by_id(doc_id: str) -> Document | None: | |
| """Find a document by its ID, or return None.""" | |
| async with get_connection() as db: | |
| cursor = await db.execute("SELECT * FROM documents WHERE id = ?", (doc_id,)) | |
| row = await cursor.fetchone() | |
| return _row_to_document(row) if row else None | |
| async def update_page_count(doc_id: str, page_count: int) -> None: | |
| """Update the page count after conversion has determined it.""" | |
| async with get_connection() as db: | |
| await db.execute( | |
| "UPDATE documents SET page_count = ? WHERE id = ?", | |
| (page_count, doc_id), | |
| ) | |
| await db.commit() | |
| async def delete(doc_id: str) -> bool: | |
| """Delete a document by ID. Returns True if a row was removed.""" | |
| async with get_connection() as db: | |
| cursor = await db.execute("DELETE FROM documents WHERE id = ?", (doc_id,)) | |
| await db.commit() | |
| return cursor.rowcount > 0 | |