import uuid from datetime import datetime from sqlalchemy import Column, String, Boolean, DateTime, Text, Integer, Enum as SQLEnum from sqlalchemy.dialects.postgresql import UUID, JSONB import enum from app.core.database import Base class TriggerType(str, enum.Enum): WELCOME = "welcome" KEYWORD = "keyword" FALLBACK = "fallback" EVENT = "event" MANUAL = "manual" class Flow(Base): __tablename__ = "flows" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name = Column(String(100), nullable=False) description = Column(Text, nullable=True) trigger_type = Column(SQLEnum(TriggerType), nullable=False) trigger_value = Column(String(255), nullable=True) nodes = Column(JSONB, default=list) edges = Column(JSONB, default=list) variables = Column(JSONB, default=dict) is_active = Column(Boolean, default=False, nullable=False) version = Column(Integer, default=1, nullable=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) class FlowSession(Base): __tablename__ = "flow_sessions" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) conversation_id = Column(UUID(as_uuid=True), nullable=False, index=True) flow_id = Column(UUID(as_uuid=True), nullable=False) current_node_id = Column(String(100), nullable=True) variables = Column(JSONB, default=dict) waiting_for_input = Column(Boolean, default=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)