"""Output task and output record models.""" from datetime import datetime from sqlalchemy import Boolean, DateTime, ForeignKey, JSON, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.models.base import Base, TimestampMixin, UUIDMixin class OutputTask(Base, UUIDMixin, TimestampMixin): """Configurable output task (e.g. daily brief).""" __tablename__ = "output_tasks" name: Mapped[str] = mapped_column(String(128), nullable=False) task_type: Mapped[str] = mapped_column(String(64), default="daily_brief", nullable=False, index=True) skill_id: Mapped[str] = mapped_column( ForeignKey("skills.id", ondelete="CASCADE"), nullable=False ) schedule: Mapped[str | None] = mapped_column(String(128), nullable=True) # cron expression filter_config: Mapped[dict] = mapped_column(JSON, default=dict, nullable=False) output_config: Mapped[dict] = mapped_column(JSON, default=dict, nullable=False) is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False) last_run_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) last_output_id: Mapped[str | None] = mapped_column( ForeignKey("outputs.id", ondelete="SET NULL"), nullable=True ) class Output(Base, UUIDMixin, TimestampMixin): """Generated output record.""" __tablename__ = "outputs" output_task_id: Mapped[str | None] = mapped_column( ForeignKey("output_tasks.id", ondelete="SET NULL"), nullable=True, index=True ) content: Mapped[str | None] = mapped_column(Text, default="") content_html: Mapped[str | None] = mapped_column(Text, default="") references: Mapped[list] = mapped_column(JSON, default=list, nullable=False) metadata: Mapped[dict] = mapped_column(JSON, default=dict, nullable=False)