135 lines
2.9 KiB
Python
135 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
import uuid
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from pydantic import Field
|
|
|
|
from app.schemas.common import BaseSchema
|
|
|
|
|
|
class DocumentUploadResponse(BaseSchema):
|
|
"""Response after document upload."""
|
|
|
|
id: uuid.UUID
|
|
filename: str
|
|
original_filename: str
|
|
content_type: str
|
|
file_size: int
|
|
checksum: str
|
|
status: str
|
|
created_at: datetime
|
|
|
|
|
|
class TextBlockResponse(BaseSchema):
|
|
"""Extracted text block."""
|
|
|
|
id: uuid.UUID
|
|
text: str
|
|
x: float
|
|
y: float
|
|
width: float
|
|
height: float
|
|
confidence: float | None
|
|
font_family: str | None
|
|
font_size: float | None
|
|
font_color: str | None
|
|
font_style: str | None
|
|
block_type: str
|
|
sequence: int
|
|
|
|
|
|
class DocumentImageResponse(BaseSchema):
|
|
"""Extracted document image."""
|
|
|
|
id: uuid.UUID
|
|
x: float
|
|
y: float
|
|
width: float
|
|
height: float
|
|
image_path: str
|
|
image_type: str
|
|
|
|
|
|
class DocumentTableResponse(BaseSchema):
|
|
"""Extracted document table."""
|
|
|
|
id: uuid.UUID
|
|
x: float
|
|
y: float
|
|
width: float
|
|
height: float
|
|
rows: int
|
|
columns: int
|
|
data: dict[str, Any] | None
|
|
|
|
|
|
class DocumentPageResponse(BaseSchema):
|
|
"""Document page with extracted content."""
|
|
|
|
id: uuid.UUID
|
|
page_number: int
|
|
width: float
|
|
height: float
|
|
image_path: str | None
|
|
text_content: str | None
|
|
text_blocks: list[TextBlockResponse] = Field(default_factory=list)
|
|
images: list[DocumentImageResponse] = Field(default_factory=list)
|
|
tables: list[DocumentTableResponse] = Field(default_factory=list)
|
|
|
|
|
|
class DocumentResponse(BaseSchema):
|
|
"""Full document response."""
|
|
|
|
id: uuid.UUID
|
|
filename: str
|
|
original_filename: str
|
|
content_type: str
|
|
file_size: int
|
|
checksum: str
|
|
storage_path: str
|
|
status: str
|
|
page_count: int | None
|
|
is_scanned: bool | None
|
|
document_metadata: dict[str, Any] | None
|
|
error_message: str | None
|
|
uploaded_by: uuid.UUID | None
|
|
pages: list[DocumentPageResponse] = Field(default_factory=list)
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class DocumentListResponse(BaseSchema):
|
|
"""Minimal document response for lists."""
|
|
|
|
id: uuid.UUID
|
|
original_filename: str
|
|
content_type: str
|
|
file_size: int
|
|
status: str
|
|
page_count: int | None
|
|
is_scanned: bool | None
|
|
created_at: datetime
|
|
|
|
|
|
class TemplateMatchResponse(BaseSchema):
|
|
"""Template match result."""
|
|
|
|
id: uuid.UUID
|
|
document_id: uuid.UUID
|
|
format_id: uuid.UUID
|
|
confidence_score: float
|
|
match_details: dict[str, Any] | None
|
|
selected: bool
|
|
template_name: str | None = None
|
|
created_at: datetime
|
|
|
|
|
|
class TemplateMatchRequest(BaseSchema):
|
|
"""Request to match a document against templates."""
|
|
|
|
document_id: uuid.UUID
|
|
min_confidence: float = Field(default=0.5, ge=0.0, le=1.0)
|
|
max_results: int = Field(default=5, ge=1, le=20)
|