from datetime import datetime from typing import Any from sqlalchemy import DateTime, ForeignKey, JSON, String, func from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base from app.utils.ids import prefixed_id class Generation(Base): __tablename__ = "generations" id: Mapped[str] = mapped_column( String(40), primary_key=True, default=lambda: prefixed_id("gen"), ) user_id: Mapped[str] = mapped_column( String(40), ForeignKey("users.id"), index=True, nullable=False, ) document_id: Mapped[str] = mapped_column( String(40), ForeignKey("documents.id"), index=True, nullable=False, ) type: Mapped[str] = mapped_column(String(60), nullable=False) output_json: Mapped[dict[str, Any]] = mapped_column(JSON, nullable=False) model_used: Mapped[str] = mapped_column(String(120), nullable=False) provider_used: Mapped[str | None] = mapped_column(String(120), nullable=True) generation_time_ms: Mapped[int | None] = mapped_column(nullable=True) is_mock_output: Mapped[bool | None] = mapped_column(nullable=True) validation_status: Mapped[str | None] = mapped_column(String(60), nullable=True) validation_error: Mapped[str | None] = mapped_column(String(1000), nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), nullable=False, )