"""document_images ORM (Phase 1B.5) — marker 추출 이미지 메타. 저장: NAS `/documents/extracted_images/{document_id}/{image_key}.{ext}` 표시: GET /api/documents/{doc_id}/images/{image_key}/raw (인증 필요) md_content 의 ref 는 `![alt](docimg:img_001)` 형식 — image_key 가 sequence 기반 결정적이라 재변환 시 idempotent. """ from datetime import datetime from sqlalchemy import BigInteger, DateTime, ForeignKey, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column from core.database import Base class DocumentImage(Base): __tablename__ = "document_images" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) document_id: Mapped[int] = mapped_column( BigInteger, ForeignKey("documents.id", ondelete="CASCADE"), nullable=False ) image_key: Mapped[str] = mapped_column(String(32), nullable=False) relative_path: Mapped[str] = mapped_column(Text, nullable=False) file_path: Mapped[str] = mapped_column(Text, nullable=False) mime_type: Mapped[str] = mapped_column(Text, nullable=False) file_size: Mapped[int] = mapped_column(BigInteger, nullable=False) content_hash: Mapped[str] = mapped_column(String(64), nullable=False) width: Mapped[int | None] = mapped_column(Integer) height: Mapped[int | None] = mapped_column(Integer) page_index: Mapped[int | None] = mapped_column(Integer) alt_text: Mapped[str | None] = mapped_column(Text) source_slug: Mapped[str | None] = mapped_column(Text) extraction_engine: Mapped[str] = mapped_column( String(32), nullable=False, default="marker" ) extraction_engine_version: Mapped[str | None] = mapped_column(String(32)) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=datetime.now, nullable=False )