from sqlalchemy import Column, String, Boolean, DateTime, Text, Integer, Enum as SQLEnum, create_engine from sqlalchemy.dialects.postgresql import UUID, JSONB from sqlalchemy.orm import sessionmaker, declarative_base import enum import uuid from datetime import datetime from app.config import get_settings settings = get_settings() engine = create_engine(settings.DATABASE_URL, pool_pre_ping=True) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_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, 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, nullable=False) def get_db(): db = SessionLocal() try: yield db finally: db.close()