diff --git a/backend/models/content_strategy_state_models.py b/backend/models/content_strategy_state_models.py new file mode 100644 index 00000000..382fbbca --- /dev/null +++ b/backend/models/content_strategy_state_models.py @@ -0,0 +1,57 @@ +"""Shared persistent state models for content strategy runtime state.""" + +from datetime import datetime + +from sqlalchemy import Column, Integer, String, DateTime, JSON, Index + +from models.enhanced_strategy_models import Base + + +class StrategyGenerationTaskState(Base): + """Stores task lifecycle/status for polling-based AI generation.""" + + __tablename__ = "strategy_generation_task_state" + + id = Column(Integer, primary_key=True) + user_id = Column(String(255), nullable=False, index=True) + task_id = Column(String(255), nullable=False, unique=True, index=True) + status_payload = Column(JSON, nullable=False) + expires_at = Column(DateTime, nullable=False, index=True) + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) + + +class LatestGeneratedStrategyState(Base): + """Stores references to latest generated strategy payload per user/resource.""" + + __tablename__ = "latest_generated_strategy_state" + + id = Column(Integer, primary_key=True) + user_id = Column(String(255), nullable=False, index=True) + resource_id = Column(String(255), nullable=False, default="comprehensive", index=True) + strategy_payload = Column(JSON, nullable=False) + expires_at = Column(DateTime, nullable=False, index=True) + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) + + __table_args__ = ( + Index("ix_latest_generated_strategy_user_resource", "user_id", "resource_id", unique=True), + ) + + +class StreamingCacheState(Base): + """Stores short-lived streaming cache entries with TTL semantics.""" + + __tablename__ = "streaming_cache_state" + + id = Column(Integer, primary_key=True) + user_id = Column(String(255), nullable=False, index=True) + cache_key = Column(String(255), nullable=False, index=True) + cache_payload = Column(JSON, nullable=False) + expires_at = Column(DateTime, nullable=False, index=True) + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) + + __table_args__ = ( + Index("ix_streaming_cache_user_key", "user_id", "cache_key", unique=True), + )