"""Workflow step ORM model.""" from datetime import datetime from typing import Any from sqlalchemy import DateTime, Enum, ForeignKey, Integer, JSON, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.domain.enums import StepStatus, WorkflowStepName from app.infra.db.base import Base, utc_now class WorkflowStepORM(Base): """Persisted workflow step execution record.""" __tablename__ = "workflow_steps" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) workflow_run_id: Mapped[int] = mapped_column( ForeignKey("workflow_runs.id"), nullable=False, index=True, ) step_name: Mapped[WorkflowStepName] = mapped_column( Enum(WorkflowStepName, native_enum=False), nullable=False, ) step_status: Mapped[StepStatus] = mapped_column( Enum(StepStatus, native_enum=False), nullable=False, ) input_json: Mapped[dict[str, Any] | None] = mapped_column(JSON, nullable=True) output_json: Mapped[dict[str, Any] | None] = mapped_column(JSON, nullable=True) error_message: Mapped[str | None] = mapped_column(Text, nullable=True) started_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=utc_now, nullable=False, ) ended_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) workflow_run = relationship("WorkflowRunORM", back_populates="steps")