"""ImageProvenance — links an ImageRecord to a Post. Many-to-one (one image, many provenance rows) enables the enrich-on-duplicate rule (spec §3): when a downloaded image is a pHash dupe of an existing record, we append a new provenance row to the existing record rather than dropping the metadata. """ from datetime import datetime from sqlalchemy import JSON, DateTime, ForeignKey, Integer, func from sqlalchemy.orm import Mapped, mapped_column from .base import Base class ImageProvenance(Base): __tablename__ = "image_provenance" id: Mapped[int] = mapped_column(Integer, primary_key=True) image_record_id: Mapped[int] = mapped_column( ForeignKey("image_record.id", ondelete="CASCADE"), nullable=False, index=True ) post_id: Mapped[int] = mapped_column( ForeignKey("post.id", ondelete="CASCADE"), nullable=False, index=True ) source_id: Mapped[int] = mapped_column( ForeignKey("source.id", ondelete="CASCADE"), nullable=False, index=True ) captured_metadata: Mapped[dict | None] = mapped_column(JSON, nullable=True) captured_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now() )