"""PMFlow Project Launch models.""" from __future__ import annotations from datetime import datetime from typing import Any, Optional from sqlalchemy import BigInteger, Float, ForeignKey, Integer, Text, TIMESTAMP, UniqueConstraint, VARCHAR from sqlalchemy.orm import Mapped, mapped_column from .base import Base from .types import JSONB class PMFlowLaunchDraft(Base): __tablename__ = "pmflow_launch_drafts" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.id"), nullable=False, index=True) draft_id: Mapped[str] = mapped_column(VARCHAR(64), nullable=False, index=True) input_text: Mapped[str] = mapped_column(Text, nullable=False) input_type: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="text") source: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="web") attachments: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list) draft_payload: Mapped[Any] = mapped_column(JSONB, nullable=False) edited_payload: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True) status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="draft", index=True) confidence: Mapped[Optional[float]] = mapped_column(Float, nullable=True) warnings: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list) confirmed_project_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("projects.id"), nullable=True, index=True) expires_at: Mapped[datetime] = mapped_column(TIMESTAMP, nullable=False, index=True) confirmed_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True) confirm_request_hash: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True) __table_args__ = ( UniqueConstraint("tenant_id", "draft_id", name="uq_pmflow_launch_drafts_tenant_draft_id"), ) class PMFlowLaunchDraftJob(Base): __tablename__ = "pmflow_launch_draft_jobs" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.id"), nullable=False, index=True) job_id: Mapped[str] = mapped_column(VARCHAR(64), nullable=False, index=True) revision_id: Mapped[str] = mapped_column(VARCHAR(64), nullable=False, index=True) parent_draft_id: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True, index=True) superseded_by_job_id: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True, index=True) result_draft_id: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True, index=True) input_text: Mapped[str] = mapped_column(Text, nullable=False) input_type: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="text") source: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="web") attachments: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list) mode: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="create") revision_note: Mapped[Optional[str]] = mapped_column(Text, nullable=True) status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="queued", index=True) result_payload: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True) changed_fields: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list) error_code: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True) error_message: Mapped[Optional[str]] = mapped_column(Text, nullable=True) started_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True) completed_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True) expires_at: Mapped[datetime] = mapped_column(TIMESTAMP, nullable=False, index=True) __table_args__ = ( UniqueConstraint("tenant_id", "job_id", name="uq_pmflow_launch_draft_jobs_tenant_job_id"), UniqueConstraint("tenant_id", "revision_id", name="uq_pmflow_launch_draft_jobs_tenant_revision_id"), ) class PMFlowThread(Base): __tablename__ = "pmflow_threads" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) project_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("projects.id"), nullable=False, index=True) launch_draft_id: Mapped[Optional[int]] = mapped_column( BigInteger, ForeignKey("pmflow_launch_drafts.id"), nullable=True, index=True ) title: Mapped[str] = mapped_column(VARCHAR(255), nullable=False) objective: Mapped[str] = mapped_column(Text, nullable=False) status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="active", index=True) source: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="project_launch", index=True) __table_args__ = ( UniqueConstraint("tenant_id", "project_id", "source", name="uq_pmflow_threads_tenant_project_source"), ) class PMFlowThreadMessage(Base): __tablename__ = "pmflow_thread_messages" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) thread_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("pmflow_threads.id"), nullable=False, index=True) project_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("projects.id"), nullable=False, index=True) launch_draft_id: Mapped[Optional[int]] = mapped_column( BigInteger, ForeignKey("pmflow_launch_drafts.id"), nullable=True, index=True ) role: Mapped[str] = mapped_column(VARCHAR(32), nullable=False) content: Mapped[str] = mapped_column(Text, nullable=False) source: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="project_launch") attachments: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list) message_metadata: Mapped[Any] = mapped_column(JSONB, nullable=False, default=dict) status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="sent", index=True) __all__ = ["PMFlowLaunchDraft", "PMFlowLaunchDraftJob", "PMFlowThread", "PMFlowThreadMessage"]