"""Platform step model — platform-owned steps, readable by all users. No account_id. No RLS. Readable by any authenticated user. Populated by promoting visibility='public' steps from step_library. """ import uuid from datetime import datetime, timezone from typing import Optional, Any from sqlalchemy import String, Boolean, DateTime, ForeignKey from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.dialects.postgresql import UUID, JSONB from app.core.database import Base class PlatformStep(Base): __tablename__ = "platform_steps" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) title: Mapped[str] = mapped_column(String(255), nullable=False) step_type: Mapped[str] = mapped_column(String(50), nullable=False, index=True) content: Mapped[dict[str, Any]] = mapped_column(JSONB, nullable=False) is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) source_step_id: Mapped[Optional[uuid.UUID]] = mapped_column( UUID(as_uuid=True), ForeignKey("step_library.id", ondelete="SET NULL"), nullable=True, ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), )