from datetime import datetime from typing import Any from sqlalchemy import DateTime, ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base from app.core.mixins import JSONB_V, TimestampMixin class ImportRun(TimestampMixin, Base): __tablename__ = "import_runs" id: Mapped[int] = mapped_column(primary_key=True) user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True) importer_id: Mapped[str] = mapped_column(String(50)) # ex: "foodvisor_csv" domain: Mapped[str] = mapped_column(String(20)) # "health" | "vape" | "finance" filename: Mapped[str] = mapped_column(String(255)) file_size: Mapped[int] = mapped_column() status: Mapped[str] = mapped_column(String(20)) # "completed" | "failed" rows_total: Mapped[int] = mapped_column(default=0) rows_inserted: Mapped[int] = mapped_column(default=0) rows_updated: Mapped[int] = mapped_column(default=0) rows_duplicates: Mapped[int] = mapped_column(default=0) rows_errors: Mapped[int] = mapped_column(default=0) # [{row, message}] capped at 100 error_details: Mapped[list[dict[str, Any]]] = mapped_column(JSONB_V, default=list) started_at: Mapped[datetime] = mapped_column(DateTime(timezone=True)) finished_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))